好吧,这就是我的情况:
我有 2 张桌子:照片,画廊。
我只想显示所有画廊,每个画廊中都有一张照片,但我在 photos(TABLE) 列 title_photo 中。
我想显示该图像,其中有 title_photo='y' 当然其他画廊的一些图像没有它(它们有 title_photo = 'n')。我有这个sql
SELECT * FROM photos
RIGHT JOIN gallery
ON gallery.code = photos.gallery_code
WHERE photos.title_photo = 'y'
GROUP BY gallery.id
我有 4 个画廊,只有一个画廊位于第
(photos TABLE) title_photo = 'y'
行。该sql仅显示
一个画廊,其中有photos(TABLE) set title_photo = 'y'
。
我的问题是:
有什么解决方案可以显示其他画廊(他们有
photos.title_photo = 'n'
)并显示有title_photo = 'y'
的画廊吗?
您似乎想要每个画廊中的“第一张”照片,其中“第一张”由 title_photo 中的值“y”定义(如果存在)。如果图库没有标题照片,我们将使用该图库中 photo.id 最小的照片作为“第一张”。
对于初学者来说,我们需要找到每个图库中“第一张”照片的伪 ID。让我们试试这个:
SELECT photos.gallery_code,
MIN(photos.id + (100000000 * photos.title_photo <> 'y')) AS pseudoid
FROM photos
GROUP BY photos.gallery_code
这为我们提供了每个画廊的一个真实的 photos.id,或者一个大一亿的 photos.id。接下来我们需要将其转回可用的照片 ID,就像这样。
SELECT gallery_code, (pseudoid MOD 100000000) AS id
FROM (
SELECT photos.gallery_code,
MIN(photos.id + (100000000 * photos.title_photo <> 'y')) AS pseudoid
FROM photos
GROUP BY photos.gallery_code
) AS firsts
接下来,我们需要将第一张照片列表加入到照片和图库表中。
SELECT p.whatever, g.whatever
FROM (
SELECT gallery_code, (pseudoid MOD 100000000) AS id
FROM (
SELECT photos.gallery_code,
MIN(photos.id + (100000000 * photos.title_photo <> 'y')) AS pseudoid
FROM photos
GROUP BY photos.gallery_code
) AS firsts
) AS f
JOIN gallery AS g ON f.gallery_code = g.code
JOIN photos AS p ON f.id = p.id
ORDER BY (whatever you need here)
看到我们在这里做什么了吗?我们使用查询来使用指定的逻辑生成图库/第一张照片关系。
然后我们将其用作子查询(虚拟表)。我们将其连接到两个数据表以检索我们需要的信息,仅用于第一张照片。
专业提示:不要在应用软件中使用 SELECT *。具体说明结果集中所需的列。
专业提示:除非您真的是专家,否则不要使用非标准 MySQL 扩展
GROUP BY
。 http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html