【发布时间】:2010-06-05 01:19:29
【问题描述】:
这是一个简化的表结构:
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
);
一个产品可以有多张照片,每个产品的第一张产品照片(基于 photo_order)是默认照片。
现在,我只需要产品详细信息页面上的所有照片,但在我列出多个产品的页面上,例如产品目录页面,我只想显示默认照片。
所以我想做的是查询产品列表,包括每个产品的默认照片。
这显然不起作用,它将返回所有照片,其中每张照片的产品信息都重复:
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 **ORDER BY ph.photo_order ASC LIMIT 1**
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
【问题讨论】:
-
请提供 PRODUCT_PHOTOS 的示例 - 我想看看 PHOTO_ORDER 如何控制默认值,因为您没有提供数据类型
-
photo_order 只是一个整数,应该每个产品都是唯一的,但不一定保证
-
如果您切换到正确的连接并通过以下方式订购:.product_title ASC、.photo_order ASC 我认为您将获得每个产品的一行,这将是第一张照片。您不会看到没有照片的产品(这可能是个问题)。不过,它应该是一个更简单的查询。
-
是的,这会是个问题,因为不能保证所有产品都至少有一张照片(很可能很多都没有)