Vinnaren i pepparkakshustävlingen!
2007-08-04, 01:34
  #1
Medlem
genos avatar
Godafton,

Jag sitter och kämpar med att joina tabeller med mysql för att få resultaten från två olika tabeller i samma query.

Vad jag vill uppnå är inte nån sorts matchning eller dyl (som de flesta tutorials och guider förklarar).
Föreställ er att jag låtit användarna ladda upp filer till min sida.
En tabell med uppladdade bilder och en tabell med uppladdad musik.
Vad jag nu vill göra är att visa alla bilder och låtar i en enda lång lista, sorterade efter tiden de skapats (ihopblandade), dock så vill jag endast välja de bilder som har ett värde i ett specifikt fält. Skulle jag göra två querys så skulle de se ut ungefär såhär:

SELECT * FROM images WHERE approved='1' ORDER BY time_created DESC
SELECT * FROM music ORDER BY time_created DESC

Jag vill nu merga dessa två till en query så att reslutaten blir typ nåt sånt här (sorterade efter tid skapad):

bild 10:05
bild 10:04
musik 09:55
bild 09:50
musik 09:45
musik 09:30
musik 09:25
bild 09:22
musik 09:13
bild 09:10
bild 09:02
Citera
2007-08-04, 02:20
  #2
Medlem
C - Js avatar
Fråga1

UNION

Fråga2

http://dev.mysql.com/doc/refman/5.0/en/union.html
Citera
2007-08-04, 02:21
  #3
Medlem
Du vill nog använda en UNION SELECT. Resultatet från alla SELECT queries i en union måste returnera samma antal columner.

Kod:
SELECT * FROM
 (
  SELECT name, time_created FROM foo WHERE approved = '1'
  UNION
  SELECT name, time_created FROM bar
 ) AS foo
ORDER BY foo.time_created DESC;

Ej testat på MySQL, har du tur så funkar det. Annars finns det ju alltid PostgreSQL.
Citera
2007-08-04, 03:39
  #4
Medlem
genos avatar
Citat:
Ursprungligen postat av aidsbarn
Du vill nog använda en UNION SELECT. Resultatet från alla SELECT queries i en union måste returnera samma antal columner.

Uhmn... måste det alltså vara samma antal rader i tabllen music som i tabellen images?
För det är det inte..... och vad gör jag då isf? (music har typ 50 rader och images drygt 1200)

Eller menar du att det måste vara samma antal fält, id, user, time_created, filename o.s.v? För det är det inte heller, det är typ 5 fält som är likadana i de båda tabellerna men i övrigt så skiljer dom sig både i antal och namn.... så då är jag fucked?
Citera
2007-08-04, 08:38
  #5
Moderator
Ruskigbusss avatar
Citat:
Ursprungligen postat av geno
Uhmn... måste det alltså vara samma antal rader i tabllen music som i tabellen images?
För det är det inte..... och vad gör jag då isf? (music har typ 50 rader och images drygt 1200)

Eller menar du att det måste vara samma antal fält, id, user, time_created, filename o.s.v? För det är det inte heller, det är typ 5 fält som är likadana i de båda tabellerna men i övrigt så skiljer dom sig både i antal och namn.... så då är jag fucked?

Nej, samma antal måste det inte vara , men däremot samma fält.

Nej, du är inte fucked, du skriver dina queries så att du bara väljer de fält som ÄR lika - precis som i aidsbarns exempel.
Citera
2007-08-04, 14:06
  #6
Medlem
genos avatar
Citat:
Ursprungligen postat av Ruskigbuss
Nej, samma antal måste det inte vara , men däremot samma fält.

Nej, du är inte fucked, du skriver dina queries så att du bara väljer de fält som ÄR lika - precis som i aidsbarns exempel.

Jahaaa!

Tack så mycket för klargörandet
... och så kom jag på en ny fråga:

Hur gör jag om jag vill skriva ut t.ex "filtyp: musik/bild" efter varje resultat nu?
Alltså hur känner jag av om ett result är en bild eller en mp3?
Citera
2007-08-04, 15:12
  #7
Medlem
Citat:
Ursprungligen postat av geno
Hur gör jag om jag vill skriva ut t.ex "filtyp: musik/bild" efter varje resultat nu?
Alltså hur känner jag av om ett result är en bild eller en mp3?
Kod:
SELECT * FROM
 (
  SELECT 'musik' AS type, name, time_created FROM foo WHERE approved = '1'
  UNION
  SELECT 'bild', name, time_created FROM bar
 ) AS foo
ORDER BY foo.time_created DESC;

Första kolumnen (som f.ö. heter "type") innehåller strängen "musik" eller "bild".
Citera
2007-08-04, 18:00
  #8
Medlem
genos avatar
Okej, tack så mycket för hjälpen
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback