首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL查询: LIMITing a JOIN

MySQL查询: LIMITing a JOIN
EN

Stack Overflow用户
提问于 2008-10-02 15:25:59
回答 3查看 1.7K关注 0票数 5

假设我有两个表,我想加入。类别:

代码语言:javascript
复制
id   name
----------
1    Cars
2    Games
3    Pencils

和项目:

代码语言:javascript
复制
id   categoryid   itemname
---------------------------
1    1            Ford
2    1            BMW
3    1            VW
4    2            Tetris
5    2            Pong
6    3            Foobar Pencil Factory

我想要一个返回类别和第一个(并且只返回第一个)项名称的查询:

代码语言:javascript
复制
category.id category.name item.id item.itemname
-------------------------------------------------
1           Cars          1       Ford
2           Games         4       Tetris
3           Pencils       6       Foobar Pencil Factory

有没有一种方法可以得到随机的结果,比如:

代码语言:javascript
复制
category.id category.name item.id item.itemname
-------------------------------------------------
1           Cars          3       VW
2           Games         5       Pong
3           Pencils       6       Foobar Pencil Factory

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2008-10-02 15:42:25

只是做了个快速测试。这似乎起作用了:

代码语言:javascript
复制
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)

我认为这将满足您的第一个问题。我不确定第二个--我认为它需要一个内部查询,使用order by random()或类似的东西!

票数 6
EN

Stack Overflow用户

发布于 2008-10-02 15:36:47

Mysql允许您拥有不包含在分组或聚合中的列,在这种情况下,它们具有随机值:

代码语言:javascript
复制
    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

或者,对于最小值,

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2008-10-21 17:19:53

Mysql确实允许包含非聚合列,并且不能保证确定性,但在我的经验中,我几乎总是得到第一个值。

所以通常(但不能保证)这会给你第一个

代码语言:javascript
复制
select * 
from categories c, items i
where i.categoryid = c.id
group by c.id;

如果你想得到保证,你需要做一些事情,比如

代码语言:javascript
复制
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)

如果您想要随机答案,则必须稍微更改子查询

代码语言:javascript
复制
 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/163004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档