Sql 将联接表中的结果限制为一行

Sql 将联接表中的结果限制为一行,sql,mysql,Sql,Mysql,下面是一个简化的表结构: TABLE products ( product_id INT (primary key, auto_increment), category_id INT, product_title VARCHAR, etc ); TABLE product_photos ( product_photo_id (primary key, auto_increment), product_id INT, photo_href VARCHAR, photo_order

下面是一个简化的表结构:

TABLE products (
 product_id INT (primary key, auto_increment),
 category_id INT,
 product_title VARCHAR,
 etc
);

TABLE product_photos (
 product_photo_id (primary key, auto_increment),
 product_id INT,
 photo_href VARCHAR,
 photo_order INT
);
一个产品可以有多张照片,每个产品的第一张产品照片(基于照片顺序)是默认照片

现在,我只需要产品详细信息页面上的所有照片,但在列出多个产品的页面上,例如产品目录页面,我只想显示默认照片

所以我想做的是查询一个产品列表,包括每个产品的默认照片

这显然不起作用,它将返回所有照片,并为每张照片复制产品信息:

SELECT p.*, ph.*
FROM products AS p
LEFT JOIN product_photos AS ph
ON p.product_id=ph.product_id
ORDER BY p.product_title ASC
我需要弄清楚如何做这样的事情,但我不知道语法(或者如果可能的话)

编辑:我从下面的答案中找到了一个解决方案,谢谢大家

SELECT p.*, ph.*
FROM products AS p
LEFT JOIN product_photos AS ph 
    ON p.product_id=ph.product_id
    AND ph.photo_order =
    (
        SELECT MIN(z.photo_order)
        FROM product_photos AS z
        WHERE z.product_id=p.product_id
    )
GROUP BY p.product_id
ORDER BY p.product_title ASC
使用:

选择p.*,ph*
从产品中提取p
内部连接产品照片(如ph)
p.product\u id=ph.product\u id
左连接产品照片,如ph2
在p.product_id=ph2.product_id上
ph2.photo_顺序

请注意它是如何两次连接到product_photos表的。ph2.photo_顺序为空的
将抛出除最低照片顺序以外的所有照片顺序。它不会保护您不受重复产品id/照片订单组合的影响,但是,如果是这样的话,您可以在p.id上添加一个
GROUP BY

请提供一个产品照片示例-我想看看照片订单如何控制默认值,因为您没有提供数据类型照片订单只是一个整数,它应该是每个产品唯一的,但不一定保证如果您切换到一个正确的加入和订购者:。产品\标题ASC,。照片\订单ASC我认为您将获得每个产品一行,这将是第一张照片。您将不会看到没有照片的产品(这可能是一个问题)。这应该是一个简单得多的查询。是的,这将是一个问题,因为不能保证所有产品都至少有一张照片(很可能很多产品不会)。我不知道这是否符合他的要求。他明确要求使用photo_order字段,而不是product_photo_id字段。这正是所需的,我只是尽可能避免子查询,因此另一个答案是。@Wrikken:与派生表/内联视图的联接不是子查询。对我来说,至少…在派生表上达成一致。你是换了你的报纸还是我完全看错了?如果我做错了,我会道歉的。哦,我不想插嘴。不完全是火焰战诱饵,但派生表是否是子查询是一个非常值得讨论的问题,我现在不会开始讨论。这并不是一种批评,我对子查询和/或派生表的废弃有时近乎不合逻辑。感谢您的回复,尽管此解决方案不支持photo_order列。尝试颠倒排序顺序。干得好。没有子查询/派生表。只需要产品id和照片订单的索引。
SELECT ...
  ....
GROUP BY p.product_id
SELECT p.*,
       pp.*
  FROM PRODUCTS p
  JOIN PRODUCT_PHOTOS pp ON pp.product_id = p.product_id
  JOIN (SELECT x.product_id,
               MIN(x.photo_order) AS default_photo
          FROM PRODUCT_PHOTOS x
      GROUP BY x.product_id) y ON y.product_id = pp.product_id
                              AND y.default_photo  = pp.photo_order
SELECT p.*, ph.*
FROM products AS p
INNER JOIN product_photos AS ph
    ON p.product_id = ph.product_id
LEFT JOIN product_photos AS ph2
    ON p.product_id = ph2.product_id
    AND ph2.photo_order < ph.photo_order
WHERE ph2.photo_order IS NULL
ORDER BY p.product_title ASC
SELECT ...
  ....
GROUP BY p.product_id
    SELECT p.*, ph.*
    FROM products AS p
    LEFT JOIN product_photos AS ph ON p.product_id=ph.product_id
    ORDER BY p.product_title ASC, ph.photo_order ASC
    GROUP BY p.product_id
    LIMIT 0,10