MySQLクエリ:JOINの制限
-
03-07-2019 - |
質問
2つのテーブルを結合したいとします。 カテゴリ:
id name
----------
1 Cars
2 Games
3 Pencils
および項目:
id categoryid itemname
---------------------------
1 1 Ford
2 1 BMW
3 1 VW
4 2 Tetris
5 2 Pong
6 3 Foobar Pencil Factory
カテゴリと最初の(そして最初の)アイテム名を返すクエリが必要です:
category.id category.name item.id item.itemname
-------------------------------------------------
1 Cars 1 Ford
2 Games 4 Tetris
3 Pencils 6 Foobar Pencil Factory
そして、次のようなランダムな結果を得る方法があります:
category.id category.name item.id item.itemname
-------------------------------------------------
1 Cars 3 VW
2 Games 5 Pong
3 Pencils 6 Foobar Pencil Factory
ありがとう!
解決
簡単なテストを完了しました。これはうまくいくようです:
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)
これで最初の質問が満たされると思います。 2番目のものについてはわかりません-random()などの順序で内部クエリが必要だと思います!
他のヒント
Mysqlを使用すると、グループ化または集計に含まれない列を持つことができます。この場合、列にはランダムな値があります。
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
または、最低限の場合、
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では非集計列を含めることができ、確定性の保証はありませんが、私の経験ではほとんど常に最初の値を取得します。
したがって、通常(ただし保証はされません)、これが最初に提供されます
select *
from categories c, items i
where i.categoryid = c.id
group by c.id;
保証が必要な場合は、次のようなことをする必要があります
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)
ランダムな回答が必要な場合は、サブクエリを少し変更する必要があります
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)
所属していません StackOverflow