我不再理解了。对于我们俱乐部的网站,我想展示我们俱乐部所有弹球机的概况。 1有2个表
表1-橱柜
cabid | owner | cabname |valid | description
--------------------------------------------------
1 | 3 | adams family | 1 | Lorem ipsum dolor sit amet
2 | 3 | Twilight zone | 1 | Lorem ipsum dolor sit amet
3 | 4 | AC/DC | 0 | Lorem ipsum dolor sit amet
4 | 5 | Lord of the Rings | 1 | Lorem ipsum dolor sit amet
表2-照片
photoid | cabid | ismain | photourl
-------------------------------------------------------------------
1 | 4 | 1 | fofofmasomfsaomfosa.jpg
2 | 4 | 0 | vdsnvnds89vds8vhsds.jpg
3 | 2 | 0 | v89ahv9sdvhs,jpg
4 | 2 | 0 | fsdfhsdfhsdavs.jpg
5 | 1 | 0 | sdv8ihsda98vhdsvs.jpg
etc
etc
不,我想在一个查询中查看表1中所有有效(无效= 1)的机柜的概述。如果有图片,请显示此图片。 (并非每个橱柜都有一张照片)如果用户将照片标记为主要照片,则必须显示此照片(主要是),否则最新的照片如同按照主要DESC,照片ASC < / p>
我现在有了这个
select c.*,p.*
from cabinets c
LEFT JOIN photos p USING (cabid )
where c.valid = '1'
GROUP by c.cabid
order by c.cabid DESC, p.ismain DESC, p.photoid ASC
LIMIT 5
但它显示错误的照片,
1快速查询是我想要的吗?
答案 0 :(得分:0)
你可以使用一个简单的左连接(你没有使用聚合函数,所以你不需要组,最终你可以使用distinct来避免重复值)
select distinct c.*, p.*
from cabinets c
LEFT JOIN photos on c.cabid = p.cabid
where c.valid = '1'
order by c.cabid DESC, p.ismain DESC, p.photoid ASC
LIMIT 5
表示性能..最重要的是在连接列上存在正确的索引
检查机柜中的cabid和照片上的cabid是否存在索引
答案 1 :(得分:0)
如果你有索引,快速取决于数据量和很多。一般来说,这是可能的。一种方法是:
select DISTINCT c.*,p.*
from cabinets c
LEFT JOIN photos p ON c.cabid=p.cabid
where c.valid = '1'
order by c.cabid DESC, p.ismain DESC, p.photoid ASC
LIMIT 5
区别在于移除GROUP BY
。您在非ANSI模式下使用GROUP BY
,这具有不可预测的行为。另外,我对GROUP BY
的问题没有任何用处。
此查询的缺点是,它会首先返回cabid=1
的所有照片,所以如果您已经为cabid=1
拍摄了超过5张照片,那么永远不会让您等到2,3等。要获得每cabid
张5张照片,您必须通过添加cabid
来查询每个WHERE cabid=?
。
答案 2 :(得分:0)
之前的两个答案似乎都没有考虑到要求 只有一张照片,如果有多个为cabid。如果存在,这应该返回正确的照片。
ul:not(:first-of-type) {}