好吧,这就是我的情况:
我有两个桌子:照片,图片库。我只想展示所有画廊的一张照片,但我在照片(表)列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'的展示画廊
发布于 2013-12-29 19:46:30
在每个图片库中,您似乎都希望获得“第一张”照片,其中"first“是由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 *。具体说明结果集中所需的列。
支持提示:除非你是真正的专家,否则不要使用GROUP BY的非标准的GROUP BY扩展。http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html
https://stackoverflow.com/questions/20828844
复制相似问题