Kom ihåg mig?

mysql if/else, flera tabeller

Ämnesverktyg Visningsalternativ
Oläst 2007-12-07, 01:14 #1
Starwebs avatar
Starweb Starweb är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2004
Inlägg: 332
Starweb Starweb är inte uppkopplad
Flitig postare
Starwebs avatar
 
Reg.datum: Jan 2004
Inlägg: 332
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 =)
Starweb är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-07, 12:04 #2
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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:
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.
mysql sorterar normalt efter stigande/fallande.
Ä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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-07, 19:38 #3
Starwebs avatar
Starweb Starweb är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2004
Inlägg: 332
Starweb Starweb är inte uppkopplad
Flitig postare
Starwebs avatar
 
Reg.datum: Jan 2004
Inlägg: 332
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.
Starweb är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-09, 13:33 #4
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-09, 17:31 #5
Starwebs avatar
Starweb Starweb är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2004
Inlägg: 332
Starweb Starweb är inte uppkopplad
Flitig postare
Starwebs avatar
 
Reg.datum: Jan 2004
Inlägg: 332
Citat:
Originally posted by elprisguiden@Dec 9 2007, 12:33
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.
Oj, tack för svar. Trodde att hoppet helt var ute.

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)
Starweb är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-09, 18:15 #6
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
tartareandesire tartareandesire är inte uppkopplad
Supermoderator
 
Reg.datum: Jan 2004
Inlägg: 11 585
Citat:
Ursprungligen postat av Starweb
Citat:
Ursprungligen postat av elprisguiden
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.
Oj, tack för svar. Trodde att hoppet helt var ute.
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)

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
tartareandesire är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-09, 19:07 #7
Starwebs avatar
Starweb Starweb är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2004
Inlägg: 332
Starweb Starweb är inte uppkopplad
Flitig postare
Starwebs avatar
 
Reg.datum: Jan 2004
Inlägg: 332
Citat:
Originally posted by tartareandesire@Dec 9 2007, 17:15
Har inte satt mig in i frågan men "Field" ska du ersätta med namnet på din kolumn förmodar jag =)
Tack för åsikt, men jag tror du har fel. Jag funderade på det först också och provade med det, men så kan det inte vara då det står "field (nummer,2,3,1,4) där "nummer" alltså är namnet på min kolumn. Att ha "nummer (nummer,2,3,1,4) verkar totalt ologiskt.

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.
Starweb är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-09, 19:15 #8
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
ä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>
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-12, 02:36 #9
Starwebs avatar
Starweb Starweb är inte uppkopplad
Flitig postare
 
Reg.datum: Jan 2004
Inlägg: 332
Starweb Starweb är inte uppkopplad
Flitig postare
Starwebs avatar
 
Reg.datum: Jan 2004
Inlägg: 332
Citat:
Originally posted by elprisguiden@Dec 9 2007, 18:15
ä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>
Attans, du är ju minst ett geni!

Bugar och tackar
Starweb är inte uppkopplad   Svara med citatSvara med citat
Oläst 2007-12-12, 10:05 #10
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 
Ämnesverktyg
Visningsalternativ

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 17:34.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017