首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接表上限制为1的MySQL连接

连接表上限制为1的MySQL连接
EN

Stack Overflow用户
提问于 2011-07-30 05:49:24
回答 11查看 153.2K关注 0票数 86

我想连接两个表,但table1上的每条记录只能得到一条table2记录

例如:

代码语言:javascript
复制
SELECT c.id, c.title, p.id AS product_id, p.title
FROM categories AS c
JOIN products AS p ON c.id = p.category_id

这将使我获得products中的所有记录,这不是我想要的。我希望每个类别的第一个产品为1(我在products字段中有一个sort列)。

我该怎么做呢?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2011-07-30 06:01:35

我会尝试这样的东西:

代码语言:javascript
复制
SELECT C.*,
      (SELECT P.id, P.title 
       FROM products as P
       WHERE P.category_id = C.id
       LIMIT 1)
FROM categories C
票数 -42
EN

Stack Overflow用户

发布于 2014-06-27 09:22:41

我更喜欢类似问题中描述的另一种方法:https://stackoverflow.com/a/11885521/2215679

这种方法更好,尤其是在需要在SELECT中显示多个字段的情况下。要避免Error Code: 1241. Operand should contain 1 column(s)或双重子选择,请为每一列选择。

根据您的情况,查询应如下所示:

代码语言:javascript
复制
SELECT
 c.id,
 c.title,
 p.id AS product_id,
 p.title AS product_title
FROM categories AS c
JOIN products AS p ON
 p.id = (                                 --- the PRIMARY KEY
  SELECT p1.id FROM products AS p1
  WHERE c.id=p1.category_id
  ORDER BY p1.id LIMIT 1
 )
票数 107
EN

Stack Overflow用户

发布于 2015-03-04 19:37:13

被@goggin13接受的答案看起来是错误的。到目前为止提供的其他解决方案也可以工作,但会受到n+1问题的影响,因此会影响性能。

n+1问题:如果有100个类别,那么我们必须执行1次选择来获取类别,然后对于返回的100个类别中的每个类别,我们都需要执行一次选择来获取该类别中的产品。因此将执行101个SELECT查询。

我的替代解决方案解决了n+1问题,因此应该会有更高的性能,因为只执行了2个选择。

代码语言:javascript
复制
SELECT
  *
FROM
    (SELECT c.id, c.title, p.id AS product_id, p.title
    FROM categories AS c
    JOIN products AS p ON c.id = p.category_id
    ORDER BY c.id ASC) AS a 
GROUP BY id;
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6879391

复制
相关文章

相似问题

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