FAQ |
Kalender |
![]() |
#1 | |||
|
||||
Flitig postare
|
Om man har två sql tabeller, tabell A som innehåller två kolumner: id, namn
och tabell B som innehåller tre kolumner: id, tabella_id, nummer Nu vill jag hämta ut alla värden från tabell A och joina in tabell B, men i tabell B så finns det ibland ETT värde där tabell A:s id matchar tabell B:s tabella_id, och ibland FLERA värden. Exempel, tabell A: id, namn 1, adam 2, kalle 3, bertil Exempel, tabell B: id, tabella_id, nummer 1, 1, 1 2, 1, 3 3, 2, 4 4, 3, 1 5, 3, 2 6, 3, 3 7, 3, 4 Hur ska min sql fråga se ut om jag vill ha ut en lista med värden där tabell A.id matchar tabell B.tabella_id i en viss ordning? Låt oss säga att jag vill ha ut tabell B enligt nummerföljden 2,3,1,4 dvs OM det finns ett värde i tabell B med nummer 2 där tabell A.id matchar tabell B.tabella_id så är det den raden i tabell B jag vill ha, men om det INTE finns ett värde med nummer 2 så vill jag istället ha värde 3, finns ej värde 3 så värde 1, annars värde 4. * Går det att skriva en mysql-förfrågning på det viset? * Går det att få till i både mysql 4.x och mysql 5.x? * Eller om det ej går, ge gärna förslag på hur på smidigast sätt får ut "bästa möjliga" sql, för att därefter loopa sig igenom värdena i php och få ut dom enligt ovanstående... Det är dock inget bra val då det ibland handlar om mängder med rader =/ Jag ANTAR att det kräver if() else() alternativt en case/switch-sats i sql-förfrågningen, något jag själv ännu ej satt mig in i. Fiktiv sql-förfrågning: SELECT * FROM tabellA If(tabellB.nummer == 2) then INNER JOIN tabellB ON ((tabellA.Id = tabellB.tabella_id) AND (tabellB.nummer = 2)) elseIf(tabellB.nummer == 3) then INNER JOIN tabellB ON ((tabellA.Id = tabellB.tabella_id) AND (tabellB.nummer = 3)) elseIf(tabellB.nummer == 1) then INNER JOIN tabellB ON ((tabellA.Id = tabellB.tabella_id) AND (tabellB.nummer = 1)) elseIf(tabellB.nummer == 4) then INNER JOIN tabellB ON ((tabellA.Id = tabellB.tabella_id) AND (tabellB.nummer = 4)) Av ovanstående exempel på vad tabellA och tabellB innehåller för värden så hade jag alltså önskat få ut följande, om vi kör enligt nummerföljden 2,3,1,4: tabellA.id, tabellA.namn, tabellB.id, tabellB.nummer 1, adam, 1, 3 2, kalle, 3, 4 3, bertil, 5, 2 Hoppas ni förstår hur jag menar med min fråga =) |
|||
![]() |
![]() |
![]() |
#2 | ||
|
|||
Klarade millennium-buggen
|
Nej, det gör vi (jag) inte. Att koppla de två tabellerna till varandra är trivialt. Men logiken i din sortering är inte glasklar:
Citat:
Är det så att du har en speciell sorteringsordning där 1 kommer efter 3 men före 4 så kan du alltid ange den i en separat tabell, koppla den och sortera efter den tredje tabellen. |
||
![]() |
![]() |
![]() |
#3 | |||
|
||||
Flitig postare
|
Hmm, tror att du missförstod, det är ingen specifik sortering jag jagar, utan en specifik selektering.
Alltså om den hittar ett värde som är 2 där id matchar, välj då den raden i tabellB, men om den inte hittar det ska den istället leta efter värde 3 där id matchar och då välja den raden osv. Det är alltså inte en sorteringsfråga (order by), utan en select if/else. |
|||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Klarade millennium-buggen
|
Pröva med
select * from (SELECT * FROM `tabell_b` order by field (nummer,2,3,1,4)) as x group by `tabella_id` Frågan är gjord bara på tabell_b , så du får koppla de två tabellerna själv. Men urvalet blir som du önskar. Frågan är lite krävande, så om prestanda är avgörande så kanske du ska fortsätta leta efter annan lösning. |
||
![]() |
![]() |
![]() |
#5 | |||
|
||||
Flitig postare
|
Citat:
Som du säger så kommer det nog inte gå då det ibland är mkt data som efterfrågas, men kan ju vara kul att klura ut hur man får det att fungera, och sen kanske man kan optimera frågan bättre. Jag provade din sql snutt, men den verkar inte förstå vad "field" är för något. Jag kör dock mysql 5. "db_namn" är namnet på min databas. Felmeddelandet: Error Code : 1305 FUNCTION db_namn.field does not exist (0 ms taken) |
|||
![]() |
![]() |
![]() |
#6 | ||
|
|||
Supermoderator
|
Citat:
Har inte satt mig in i frågan men "Field" ska du ersätta med namnet på din kolumn förmodar jag =)
__________________
Full-stack developer, free for smaller assignments |
||
![]() |
![]() |
![]() |
#7 | |||
|
||||
Flitig postare
|
Citat:
Får invänta svar av elpris och se om jag eller båda har fel, han verkar ha koll på läget ![]() Lite trist att vi inte har fler "mysql experter" på WN bara, man kan ju spara SÅ mkt tid och serverkraft med smarta förfrågningar, eller ibland snabbare med 2 förfrågningar som nån nämnt. |
|||
![]() |
![]() |
![]() |
#8 | ||
|
|||
Klarade millennium-buggen
|
ändrar för tredje gången.
Det är ett mellanslag som ställer till det, mellan field och ( Så här: mysql> SELECT * -> FROM ( -> -> SELECT * -> FROM `tabell_b` -> ORDER BY field( nummer, 2, 3, 1, 4 ) -> ) AS x -> GROUP BY `tabella_id` ; +----+------------+--------+ | id | tabella_id | nummer | +----+------------+--------+ | 2 | 1 | 3 | | 3 | 2 | 4 | | 5 | 3 | 2 | +----+------------+--------+ 3 rows in set (0.00 sec) mysql> SELECT * FROM ( SELECT * FROM `tabell_b` ORDER BY field ( nummer, 2, 3, 1, 4 ) ) AS x GROUP BY `tabella_id`; ERROR 1305 (42000): FUNCTION example.field does not exist mysql> |
||
![]() |
![]() |
![]() |
#9 | |||
|
||||
Flitig postare
|
Citat:
Bugar och tackar ![]() |
|||
![]() |
![]() |
![]() |
#10 | ||
|
|||
Klarade millennium-buggen
|
Det var så lite så. Normalt har man ingen koll på vilka rader som tas fram i en group by-förfrågan, men det här är ett sätt att få till det. Skulle förenkla för många om detta fanns som en inbyggd funktion.
|
||
![]() |
![]() |
Svara |
|
|