MySQL och Join - ännu en gång...

Tråden skapades och har fått 3 svar. Det senaste inlägget skrevs .
1
  • Medlem
  • Höganäs
  • 2005-05-13 11:40

Har följande tabeller:

objekt:
+-----+------------+
| id  | objektnamn |
+-----+------------+
|  41 | 271a       |
|  42 | 271b       |
|  43 | 272a       |
|  44 | 272b       |
|  45 | 273a       |
|  46 | 273b       |
+-----+------------+

kontrollrader:
+----+----------+------------+-------+
| id | objektid | bokningsnr | dagnr |
+----+----------+------------+-------+
| 90 |       45 |       4015 |     2 |
| 91 |       45 |       4015 |     4 |
| 92 |       45 |       4015 |     3 |
| 94 |       46 |       4016 |     4 |
| 95 |       46 |       4016 |     5 |
| 96 |       42 |       4017 |     3 |
| 97 |       42 |       4017 |     4 |
| 98 |       42 |       4018 |     6 |
+----+----------+------------+-------+


Så här är det nu:

mysql> SELECT objekt.objektnamn, bokningar.bokningsnr, kontrollrader.dagnr 
FROM bokningar, kontrollrader, objekt  
WHERE bokningar.bokningsnr = kontrollrader.bokningsnr AND kontrollrader.objektid = objekt.id  
ORDER  BY objekt.objektnamn DESC, kontrollrader.dagnr ASC LIMIT 0, 30;
+------------+------------+-------+
| objektnamn | bokningsnr | dagnr |
+------------+------------+-------+
| 273a       |       4015 |     2 |
| 273a       |       4015 |     3 |
| 273a       |       4015 |     4 |
| 273b       |       4016 |     4 |
| 273b       |       4016 |     5 |
| 271b       |       4017 |     3 |
| 271b       |       4017 |     4 |
| 271b       |       4018 |     6 |
+------------+------------+-------+
8 rows in set (0.00 sec)

Vad jag vill uppnå:

+------------+------------+-------+
| objektnamn | bokningsnr | dagnr |
+------------+------------+-------+
| 271a       |       null |  null |
| 271b       |       4017 |     3 |
| 271b       |       4017 |     4 |
| 271b       |       4018 |     6 |
| 272a       |       null |  null |
| 272b       |       null |  null |
| 273a       |       4015 |     2 |
| 273a       |       4015 |     3 |
| 273a       |       4015 |     4 |
| 273b       |       4016 |     4 |
| 273b       |       4016 |     5 |
+------------+------------+-------+

Dvs att objekt som ingen motsvarande kontrollrad har, ändå skrivs ut _en_ gång.

Hur ser en JOIN ut för att det ska uppnås?

  • Medlem
  • 2005-05-13 11:54

Från http://dev.mysql.com/doc/mysql/en/join.html

If there is no matching record for the right table in the ON or USING part in a LEFT JOIN, a row with all columns set to NULL is used for the right table. You can use this fact to find records in a table that have no counterpart in another table:

mysql> SELECT table1.* FROM table1
-> LEFT JOIN table2 ON table1.id=table2.id
-> WHERE table2.id IS NULL;
This example finds all rows in table1 with an id value that is not present in table2 (that is, all rows in table1 with no corresponding row in table2). This assumes that table2.id is declared NOT NULL.

  • Medlem
  • Sollefteå
  • 2005-05-13 11:56

Använd en LEFT JOIN för att få med alla rader i den vänstra tabellen och visa nullvärden för den högra tabellen när inte en match kan göras.

Tillexempel:

SELECT A.artnr, A.description, S.date, S.customer
FROM Artiklar AS A
LEFT JOIN Sales AS S
ON A.artNr = S.ArtNr
WHERE A.ArtNr > 2000 AND A.ArtNr < 3000
ORDER BY A.description

Edit: Attans, skrev för lågsamt

  • Medlem
  • Höganäs
  • 2005-05-13 12:00

Tacketack.
Ska genast testa...

/M

1
Bevaka tråden