如何为一对多进行INNER JOIN,其中许多人只返回一个

时间:2015-11-25 01:32:21

标签: mysql join

我有这个查询

SELECT  p.productId,
        p.productTitle,
        p.productPrice1,
        p.productPrice2,
        p.productPart,
        pi.productImageTitle,
        pi.productImageDescription,
        pi.productImageFile,
        pi.productImageOrder
FROM product AS p
LEFT JOIN productImage AS pi
    ON p.productId = pi.productId
ORDER BY p.productId ASC

SQL Fiddle with test data

我想要的是所有产品,无论他们是否有图像,但如果有联合图像我只想得到一个。目前使用产品b ,它将返回4行,因为有4个图像。

我确实尝试过sub SELECT in the INNER JOIN with LIMIT 1,但只允许加入一张图片。另外,您可以看到数据productImageOrder并不总是从一开始,所以我不能只在INNER JOIN

中过滤非1

4 个答案:

答案 0 :(得分:0)

为产品添加GROUP BY应该

SELECT  p.productId,
    p.productTitle,
    p.productPrice1,
    p.productPrice2,
    p.productPart,
    pi.productImageTitle,
    pi.productImageDescription,
    pi.productImageFile,
    pi.productImageOrder
FROM product AS p
LEFT JOIN productImage AS pi
ON p.productId = pi.productId
GROUP BY p.productId
ORDER BY p.productId ASC

答案 1 :(得分:0)

使用

SELECT  p.productId,
        p.productTitle,
        p.productPrice1,
        p.productPrice2,
        p.productPart,
        pi.productImageTitle,
        pi.productImageDescription,
        pi.productImageFile,
        pi.productImageOrder
FROM product AS p
LEFT JOIN productImage AS pi
    ON p.productId = pi.productId
GROUP BY p.productId
ORDER BY p.productId ASC

基本上只是添加GROUP BY子句。

请注意,这是一个MySQLism - 其他RDBMS会抛出“无效使用聚合”或类似错误。

答案 2 :(得分:0)

如何使用select来获取要连接的productImageID

SELECT  p.productId,
            p.productTitle,
            p.productPrice1,
            p.productPrice2,
            p.productPart,
            pi.productImageTitle,
            pi.productImageDescription,
            pi.productImageFile,
            pi.productImageOrder


    FROM product AS p
    LEFT JOIN productImage AS pi
        ON pi.productImageID = (select productImageId from productImage as pi2 where p.productId = pi2.productId order by productImageOrder Limit 1)
    ORDER BY p.productId ASC

SQL Fiddle

如果您没有将其他字段放在聚合函数中,例如,此方法可能实际上可用于其他不能使用GROUP BY的RDBMS。 MIN,MAX,SUM等。

答案 3 :(得分:0)

如果要避免外部聚合,可以使用连接:

select p.*, pi.*
from (select p.*,
             (select pi.productImageId
              from productImage pi
              where p.productId = pi.productId
             ) as productImageId
      from product p
     ) p join
     productImage pi
     on p.productImageId = pi.productImageId
order by p.productId;

这种方法的三个优点是:

  1. 实现子查询可能比进行聚合更快。
  2. 您可以更好地控制自己拍摄的图像(在相关子查询中使用order by)。
  3. 这是标准的SQL,不使用任何MySQL扩展。
  4. 您确实需要productImage(productId)productImage(productImageId)上的索引才能获得最佳效果。