5

結合したいテーブルが 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

カテゴリと最初の (そして最初のみの) itemname を返すクエリが必要です。

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

ありがとう!

4

3 に答える 3

6

簡単なテストを行いました。これはうまくいくようです:

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番目のものについてはわかりません- order by random() またはそのようなものを使用した内部クエリが必要だと思います!

于 2008-10-02T15:42:24.673 に答える
0

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)
于 2008-10-21T17:19:52.840 に答える
0

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
于 2008-10-02T15:36:47.323 に答える