[MySQL] insert 2 column select 4 column

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • shuyg
  • Registratie: September 2013
  • Niet online
Ik probeer de volgende query uit te voeren (theoretisch).

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO Playlist (release_id, name)
  SELECT R.id, R.name, COUNT(T.id) AS tracks, R.track_count, F.id FROM `Release` R
    INNER JOIN Media M ON R.id = M.release_id
    INNER JOIN Track T ON M.id = T.media_id
    INNER JOIN Recording REC ON T.recording_id = REC.id
    LEFT JOIN fingerprint_recording FR ON REC.id = FR.recording_id
    LEFT JOIN file_fingerprint FF ON FR.fingerprint_id = FF.fingerprint_id
    LEFT JOIN File F ON FF.file_id = F.id
  WHERE
    R.cover_front = 1 
  GROUP BY
    R.id
  HAVING
    COUNT(T.id) = R.track_count AND F.id IS NOT NULL


Dit werkt niet omdat ik 4 kolommen in een tabel met 2 kolommen probeer te plakken. Is er een manier om dit binnen de query toch op te lossen?

Ik heb het al vaak aan Google gevraagd. Het maakt niet zoveel uit of ik het aardig of onaardig vraag. Google wil helaas geen geschikt antwoord geven.

Beste antwoord (via shuyg op 03-02-2018 20:57)


  • LinuX-TUX
  • Registratie: December 2003
  • Laatst online: 07-10 16:38
shuyg schreef op zaterdag 3 februari 2018 @ 14:06:
[...]


Dat klopt, maar dat blijkt niet te gelden voor het HAVING deel. Als ik namelijk F.id uit de SELECT haal dan krijg ik onderstaande foutmelding. Dezelfde foutlmelding geldt voor track_count, maar dan uiteraard voor dat veld. Ik heb dus geconcludeerd dat je de velden in HAVING ook in de SELECT moet hebben en dus houd ik wat kolommen over die ik niet in de INSERT wil hebben.

code:
1
#1054 - Unknown column 'F.id' in 'having clause'


Al met al krijg ik het niet voor elkaar om deze query (of iets vergelijkbaars) uit te voeren. Is er nog iemand met een idee?


[...]


Behalve dat dat mijn vraag niet was. De query was theoretisch om aan te geven wat ik wou bereiken. Kortom de vraag stond in de query, behalve dat dat niet de oplossing voor het probleem was.
oK, begin nu te snappen wat je probleem is. Ik weet niet in hoeverre de group & having nodig is, maar ga ervan uit dat je weet wat je doet en wilt bereiken.

Om het dan toch exact te krijgen zoals je wilt, zul je uit moeten wijken naar een subquery

Alle reacties


Acties:
  • 0 Henk 'm!

  • MSteverink
  • Registratie: Juni 2004
  • Laatst online: 24-09 15:32
Het zijn er eigenlijk 5, geen 4. Maar dat past ook niet in een tweekolommer.

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO Playlist (release_id, name)
  SELECT R.id, R.name/*, COUNT(T.id) AS tracks, R.track_count, F.id*/ FROM `Release` R
    INNER JOIN Media M ON R.id = M.release_id
    INNER JOIN Track T ON M.id = T.media_id
    INNER JOIN Recording REC ON T.recording_id = REC.id
    LEFT JOIN fingerprint_recording FR ON REC.id = FR.recording_id
    LEFT JOIN file_fingerprint FF ON FR.fingerprint_id = FF.fingerprint_id
    LEFT JOIN File F ON FF.file_id = F.id
  WHERE
    R.cover_front = 1 
  GROUP BY
    R.id
  HAVING
    COUNT(T.id) = R.track_count AND F.id IS NOT NULL

[ Voor 25% gewijzigd door MSteverink op 02-02-2018 17:02 ]


Acties:
  • 0 Henk 'm!

  • LinuX-TUX
  • Registratie: December 2003
  • Laatst online: 07-10 16:38
Even een vervelende vraag: Wat wil je nu precies bereiken?

Je geeft zelf al aan dat je teveel kolommen selecteert en het doel tabel dat niet aan kan. Dus zijn er 2 oplossingen:
* Je voegt extra kolommen toe in het doel tabel
* Je selecteert gewoon 2 kolommen ipv 5

Acties:
  • 0 Henk 'm!

Verwijderd

Dat laatste, dus - ik snap niet waarom je die andere 3 er bij hebt staan.

Acties:
  • 0 Henk 'm!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 16:15
shuyg schreef op vrijdag 2 februari 2018 @ 14:05:

Dit werkt niet omdat ik 4 kolommen in een tabel met 2 kolommen probeer te plakken.
En zo heb je je eigen vraag beantwoord voordat je hem gesteld hebt.

Roomba E5 te koop


Acties:
  • 0 Henk 'm!

  • Merethil
  • Registratie: December 2008
  • Laatst online: 16:12
shuyg schreef op vrijdag 2 februari 2018 @ 14:05:
Ik probeer de volgende query uit te voeren (theoretisch).

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO Playlist (release_id, name)
  SELECT R.id, R.name, COUNT(T.id) AS tracks, R.track_count, F.id FROM `Release` R
    INNER JOIN Media M ON R.id = M.release_id
    INNER JOIN Track T ON M.id = T.media_id
    INNER JOIN Recording REC ON T.recording_id = REC.id
    LEFT JOIN fingerprint_recording FR ON REC.id = FR.recording_id
    LEFT JOIN file_fingerprint FF ON FR.fingerprint_id = FF.fingerprint_id
    LEFT JOIN File F ON FF.file_id = F.id
  WHERE
    R.cover_front = 1 
  GROUP BY
    R.id
  HAVING
    COUNT(T.id) = R.track_count AND F.id IS NOT NULL


Dit werkt niet omdat ik 4 kolommen in een tabel met 2 kolommen probeer te plakken. Is er een manier om dit binnen de query toch op te lossen?

Ik heb het al vaak aan Google gevraagd. Het maakt niet zoveel uit of ik het aardig of onaardig vraag. Google wil helaas geen geschikt antwoord geven.
Onderstaande is misschien overbodig maar ik dacht, ik meld het toch indien je het niet wist:

De zaken die je in de where/group by/order by/joins gebruikt hoef je niet per sé ook in je select te zetten. Dus haal lekker de velden uit de select die je niet nodig hebt.

Acties:
  • 0 Henk 'm!

  • shuyg
  • Registratie: September 2013
  • Niet online
Merethil schreef op vrijdag 2 februari 2018 @ 20:50:
[...]
De zaken die je in de where/group by/order by/joins gebruikt hoef je niet per sé ook in je select te zetten. Dus haal lekker de velden uit de select die je niet nodig hebt.
Dat klopt, maar dat blijkt niet te gelden voor het HAVING deel. Als ik namelijk F.id uit de SELECT haal dan krijg ik onderstaande foutmelding. Dezelfde foutlmelding geldt voor track_count, maar dan uiteraard voor dat veld. Ik heb dus geconcludeerd dat je de velden in HAVING ook in de SELECT moet hebben en dus houd ik wat kolommen over die ik niet in de INSERT wil hebben.

code:
1
#1054 - Unknown column 'F.id' in 'having clause'


Al met al krijg ik het niet voor elkaar om deze query (of iets vergelijkbaars) uit te voeren. Is er nog iemand met een idee?
sig69 schreef op vrijdag 2 februari 2018 @ 18:31:
En zo heb je je eigen vraag beantwoord voordat je hem gesteld hebt.
Behalve dat dat mijn vraag niet was. De query was theoretisch om aan te geven wat ik wou bereiken. Kortom de vraag stond in de query, behalve dat dat niet de oplossing voor het probleem was.

Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • LinuX-TUX
  • Registratie: December 2003
  • Laatst online: 07-10 16:38
shuyg schreef op zaterdag 3 februari 2018 @ 14:06:
[...]


Dat klopt, maar dat blijkt niet te gelden voor het HAVING deel. Als ik namelijk F.id uit de SELECT haal dan krijg ik onderstaande foutmelding. Dezelfde foutlmelding geldt voor track_count, maar dan uiteraard voor dat veld. Ik heb dus geconcludeerd dat je de velden in HAVING ook in de SELECT moet hebben en dus houd ik wat kolommen over die ik niet in de INSERT wil hebben.

code:
1
#1054 - Unknown column 'F.id' in 'having clause'


Al met al krijg ik het niet voor elkaar om deze query (of iets vergelijkbaars) uit te voeren. Is er nog iemand met een idee?


[...]


Behalve dat dat mijn vraag niet was. De query was theoretisch om aan te geven wat ik wou bereiken. Kortom de vraag stond in de query, behalve dat dat niet de oplossing voor het probleem was.
oK, begin nu te snappen wat je probleem is. Ik weet niet in hoeverre de group & having nodig is, maar ga ervan uit dat je weet wat je doet en wilt bereiken.

Om het dan toch exact te krijgen zoals je wilt, zul je uit moeten wijken naar een subquery

Acties:
  • 0 Henk 'm!

Verwijderd

shuyg schreef op zaterdag 3 februari 2018 @ 14:06:
Dat klopt, maar dat blijkt niet te gelden voor het HAVING deel. Als ik namelijk F.id uit de SELECT haal dan krijg ik onderstaande foutmelding.
En als je van die LEFT JOINs nou eens INNER JOINs maakt? Dan bereik je precies hetzelfde.

Acties:
  • +2 Henk 'm!

  • shuyg
  • Registratie: September 2013
  • Niet online
Verwijderd schreef op zaterdag 3 februari 2018 @ 14:25:
En als je van die LEFT JOINs nou eens INNER JOINs maakt? Dan bereik je precies hetzelfde.
Ik heb de LEFT JOINS uiteindelijk weg kunnen werken met behulp van een subquery. In principe had ik de LEFT-join wel nodig.
LinuX-TUX schreef op zaterdag 3 februari 2018 @ 14:16:
Om het dan toch exact te krijgen zoals je wilt, zul je uit moeten wijken naar een subquery
Met dank aan LinuX-TUX zijn het inderdaad een aantal subqueries geworden. Hiermee heb ik het HAVING statement weg kunnen werken. Hieronder de uiteindelijke oplossing.

MySQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
INSERT INTO Playlist (release_id, name)
  SELECT R.id, R.name FROM `Release` R
    
    INNER JOIN (
        SELECT COUNT(Track.id) AS tracks, Media.release_id AS release_id, Track.recording_id AS recording_id FROM Media, Track WHERE Media.id = Track.media_id GROUP BY Media.release_id
    ) MT ON R.id = MT.release_id AND MT.tracks = R.track_count
    
    INNER JOIN Recording REC ON MT.recording_id = REC.id
    INNER JOIN fingerprint_recording FR ON REC.id = FR.recording_id
    
    INNER JOIN (
        SELECT MAX(file_id) AS file_id, fingerprint_id FROM file_fingerprint GROUP BY file_id
    ) FF ON FR.fingerprint_id = FF.fingerprint_id 
    
    INNER JOIN File F ON FF.file_id = F.id
  WHERE
    R.cover_front = 1 
  GROUP BY
    R.id
Pagina: 1