MySQL-Abfrage:Die Begrenzung auf einen JOIN
-
03-07-2019 - |
Frage
Sagen, ich habe zwei Tabellen, die ich verbinden möchte.Kategorien:
id name
----------
1 Cars
2 Games
3 Pencils
Und items:
id categoryid itemname
---------------------------
1 1 Ford
2 1 BMW
3 1 VW
4 2 Tetris
5 2 Pong
6 3 Foobar Pencil Factory
Ich möchte eine Abfrage zurückgibt, die die Kategorie und die erste (und nur die erste) itemname:
category.id category.name item.id item.itemname
-------------------------------------------------
1 Cars 1 Ford
2 Games 4 Tetris
3 Pencils 6 Foobar Pencil Factory
Und gibt es eine Möglichkeit, ich könnte Holen Sie sich zufällige Ergebnisse wie:
category.id category.name item.id item.itemname
-------------------------------------------------
1 Cars 3 VW
2 Games 5 Pong
3 Pencils 6 Foobar Pencil Factory
Vielen Dank!
Lösung
Nur einen Schnelltest durchgeführt. Dies scheint zu funktionieren:
mysql> select * from categories c, items i
-> where i.categoryid = c.id
-> group by c.id;
+------+---------+------+------------+----------------+
| id | name | id | categoryid | name |
+------+---------+------+------------+----------------+
| 1 | Cars | 1 | 1 | Ford |
| 2 | Games | 4 | 2 | Tetris |
| 3 | Pencils | 6 | 3 | Pencil Factory |
+------+---------+------+------------+----------------+
3 rows in set (0.00 sec)
Ich denke, dies ist Ihre erste Frage erfüllen würde. Nicht sicher das zweite - ich denke, dass eine innere Abfrage mit, um durch gelegentliche benötigt () oder so ähnlich
Andere Tipps
Mysql erlaubt es Ihnen, die Spalten nicht enthalten in der Gruppierung oder aggregate, in welchem Fall Sie haben zufällige Werte:
select category.id, category.name, itemid, itemname
inner join
(select item.categoryid, item.id as itemid, item.name as itemname
from item group by categoryid)
on category.id = categoryid
Oder, für die minima,
select category.id, category.name, itemid, itemname
inner join
(select item.categoryid, min(item.id) as itemid, item.name as itemname
from items
group by item.categoryid)
on category.id = categoryid
Mysql nicht lassen sind nicht aggregierten Spalten und es gibt keine Garantie für Determinismus, aber in meiner Erfahrung, die ich bekommen fast immer die ersten Werte.
Also in der Regel (aber nicht garantiert) dies wird Ihnen die erste Seite
select *
from categories c, items i
where i.categoryid = c.id
group by c.id;
Wenn Sie garantiert möchten, müssen Sie so etwas wie
tunselect categories.id, categories.name, items.id, items.name
from categories inner join
items on items.categoryid = categories.id and
items.id = (select min(items2.id) from items as items2 where items2.categoryid = category.id)
Wenn Sie zufällige Antworten wollen, müssen Sie die Unterabfrage ein wenig ändern müssen
select categories.id, categories.name, items.id, items.name
from categories inner join
items on items.categoryid = categories.id and
items.id = (select items2.id from items as items2 where items2.categoryid = category.id order by rand() limit 1)