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!

War es hilfreich?

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

tun
select 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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top