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 - 连接 - 返回太多行 - 每个连接表一个,但不想要那个的主要内容,如果未能解决你的问题,请参考以下文章