[英]How to select possible row in sql
好吧,这是我的情况:
我有2张桌子: 照片 , 画廊 。 我只想显示每个画廊中所有画廊的一张照片,但是我在“ 照片” (表格)列中的“ 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或一个太大的一亿个。 接下来,我们需要像这样将其转换为可用的照片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
接下来,我们需要将第一张照片的列表加入到photos and gallery表中。
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
使用非标准的MySQL扩展。 http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.