mysql lleft可以使用右表中的一条最新记录加入吗?

时间:2017-08-19 16:16:00

标签: mysql mysqli

我不再理解了。对于我们俱乐部的网站,我想展示我们俱乐部所有弹球机的概况。 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快速查询是我想要的吗?

3 个答案:

答案 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) {}