【问题标题】:mysql lleft join possible with one latest record from right table?mysql左连接可能与右表中的一条最新记录一起使用?
【发布时间】:2018-01-28 03:32:45
【问题描述】:

我不明白了。对于我们俱乐部的网站,我想展示我们俱乐部中所有弹球机的概述。 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)。如果有图片,请展示这个。 (不是每个柜子都有照片)如果用户将照片标记为主图片,则必须显示这张照片,(ismain)否则最新的类似 order by ismain DESC, photoid ASC

我现在有了这个

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 个快速查询可以实现我想要的吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    前面的两个答案似乎都没有考虑到要求 如果 cabid 有多张照片,则只需一张照片。如果存在,这应该会返回正确的照片。

    SELECT a.*
        b.*
    FROM cabinets a
    LEFT JOIN (
        SELECT * 
        FROM photos 
        WHERE a.cabid = b.cabid 
        ORDER BY b.ismain DESC 
        LIMIT 1) b
    ON a.cabid = b.cabid
    WHERE a.valid = 1
    ORDER BY a.cabid
    

    【讨论】:

    • 谢谢,但这给了我一个:'where 子句'中的未知列'a.cabid',如果我使用“WHERE 'a.cabid' = 'b.cabid'”它找不到照片完全没有:(
    • 表格照片是否有名为cabid的列?拼写不同吗?
    【解决方案2】:

    你可以使用一个简单的左连接(你没有使用聚合函数,所以你不需要 group by 最终你可以使用 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

    【讨论】:

    • 我听说你应该避免使用 'SELECT *',因为它会减慢查询速度?
    • 如果 OP 需要所有列 .. 使用 select * 或 select .. col1, col2。等等对于性能来说是一样的......只有当 OP 只需要一些列并且这些列存储在所涉及的索引中时才有区别
    • 在这种情况下,他不需要数据库中的每个值,所以我猜你可以选择特定的列
    • 在这种情况下,性能最重要的方面是连接所涉及的列上是否存在索引 ..(回答说这个)
    【解决方案3】:

    快速取决于数据量,很大程度上取决于您是否有索引。一般来说是可以的。一种方法是:

    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 的所有照片,因此如果您已经有超过 5 张cabid=1 的照片,则永远不会让您返回 2,3 等。要获取每个 cabid 的 5 张照片,您必须通过添加 WHERE cabid=? 来查询每个 cabid

    【讨论】:

      猜你喜欢
      • 2015-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2011-04-29
      • 1970-01-01
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多