Mysql - 连接 - 返回太多行 - 每个连接表一个,但不想要那个

Posted

技术标签:

【中文标题】Mysql - 连接 - 返回太多行 - 每个连接表一个,但不想要那个【英文标题】:Mysql - joins - too many rows are being returned - one for each of the joined table but dont want that 【发布时间】:2012-05-13 14:39:50 【问题描述】:

我有这种mysql db(表名/字段)

tbl_users:id、标题、已批准

tbl_photos:id、user_id、标题、文件名

我在用户中有一排,三张照片(都带有user_id =用户的id)

这样做:

select 
tbl_users.*, 
tbl_photos.filename 

from tbl_users 

left join tbl_photos on tbl_photos.user_id = tbl_users.id 

where tbl_users = '1' order by rand() 

(表查询简化了一点)

执行该 sql 查询会返回三行。我只想要一行(即我想要用户行,加上任何具有该用户 ID 的 user_id 的随机照片)

我已经尝试了所有的连接 - 左右内,但它们总是返回 3 行

【问题讨论】:

【参考方案1】:

您的代码应如下所示

select 
tbl_users.*, 
tbl_photos.filename 

from tbl_users 

left join tbl_photos on tbl_photos.user_id = tbl_users.id 

where tbl_users = approved order by rand() LIMIT 1

LIMIT 关键字将限制查询只返回 1 行。

可以在这里找到一个简单的 my-sql 命令示例列表 http://itswadesh.wordpress.com/2011/04/12/mysql-commands/

【讨论】:

在这个确切的示例中,我只有一个用户,但我想为每个用户返回所有用户一张随机照片(如果存在)。添加限制 1 会将整个查询限制为一个 @notsid:如果您想要每个用户一行(一张照片),您应该在您的问题中添加它。我们没有精神力量。【参考方案2】:

你也加DISTINCT:

select  DISTINCT tbl_users.id, 
        tbl_users.title, 
        tbl_users.approved, 
        tbl_photos.filename 
from tbl_users left join tbl_photos 
       on tbl_photos.user_id = tbl_users.id 
where tbl_users = 'approved' order by rand() 

【讨论】:

你用单引号括住Approved?它是一个字符串,所以你需要把它括起来。 是的,“它不起作用”是指它仍然返回 3 个结果,而不是 sql 错误【参考方案3】:

如果你只想为每一行获取一行,这很简单

select 
tbl_users.*, 
GROUP_CONCAT(tbl_photos.filename) as Photos

from tbl_users 

left join tbl_photos on tbl_photos.user_id = tbl_users.id 

where tbl_users = '1' order by rand() 

它将在单个字段中为您提供逗号分隔的值

【讨论】:

如果您删除 where 条件,您将获得所有用户。对于每个用户,您将获得与每个用户相关的照片【参考方案4】:

如果文件名是您将从 tbl_photos 中检索的唯一字段,则这可以提供您需要的内容:

select 
    tbl_users.*, 

    (select filename 
     from tbl_photos where user_id = tbl_users.id 
     order by rand()
     limit 1) as filename

from tbl_users 

如果您想从照片中获取其他信息,这是查询:

select tbl_users.*, 'x' as separator, tbl_photos.*
from tbl_users
left join tbl_photos on tbl_photos.user_id = tbl_users.id
where (tbl_users.id, tbl_photos.id) in

    (  
    -- you can run this query independently
        select 

            id, 

            (select id 
             from tbl_photos 
             where user_id = tbl_users.id 
             order by rand() 
             limit 1) 

        from tbl_users
    )

【讨论】:

以上是关于Mysql - 连接 - 返回太多行 - 每个连接表一个,但不想要那个的主要内容,如果未能解决你的问题,请参考以下文章

MySql - 使用连接子查询插入多行?

Azure 流分析:多个 Windows JOIN 生成太多行

MySQL select in join 子句扫描太多行

如何在MySQL中连接两个字符串

在 MySQL 或 PHP 中连接多行

连接 5 个表 - 1 个主表加上 4 个主表有多行,但主数据重复