mysql - 子查询和连接
Posted
技术标签:
【中文标题】mysql - 子查询和连接【英文标题】:mysql - subqueries and joins 【发布时间】:2010-11-06 12:38:11 【问题描述】:我不太确定这是否是正确的方法,这是我的情况:
我目前正在尝试选择 15 个画廊,然后通过 id 将其与用户表左连接,但我也想从每个画廊中选择一张随机图片,但是据我所知,您不能限制左连接(图片)只选择一张随机图片而不做子查询。
这是我到目前为止得到的,但它没有按应有的方式工作:
SELECT galleries.id, galleries.name, users.username, pictures.url
FROM galleries
LEFT JOIN users ON users.id = galleries.user_id
LEFT JOIN pictures ON (
SELECT pictures.url
FROM pictures
WHERE pictures.gallery_id = galleries.id
ORDER BY RAND()
LIMIT 1)
WHERE active = 1
ORDER BY RAND()
LIMIT 15
我也尝试用 Active Record 来做这件事,但是在做了两次左连接后我卡住了,是否可以在这里获取子查询:
$this->db->select('galleries.id, galleries.name, users.id as user_id, users.username');
$this->db->from('galleries');
$this->db->join('users', 'users.id = galleries.user_id','left');
$this->db->join('pictures','pictures.gallery_id = galleries.id AND','left');
$this->db->where('active',1);
我希望它不要乱,但我真的开始对所有的 sql 查询感到困惑..
编辑: Active Record with CodeIgniter
【问题讨论】:
+1 获得对 Active Record 的有趣引用...您能否编辑以包含链接? 【参考方案1】:您可以在子查询中获取随机图片:
select
g.name, u.username,
(select url from pictures p where p.gallery_id = g.gallery_id
order by rand() limit 1) as url
from galleries g
left join users u on g.user_id = u.id
where g.active = 1
根据您的评论,您可以在子查询中为每个图库选择一张图片。这是假设图片表有一个 ID 列。
select
g.name, u.username, p.url, p.name
from (
select id, user_id, name,
(select id from pictures p
where p.gallery_id = g.gallery_id
order by rand() limit 1) as samplepictureid
from galleries
where g.active = 1
) g
left join users u on g.user_id = u.id
left join pictures p on p.id = g.samplepictureid
【讨论】:
是否可以从子查询中检索两个变量?我得到的只是“操作数应包含 1 列”例如,如果我想要 url 和名称而不做两个子查询? 这样的子查询只能检索一列(和一行)。您还想检索哪一列? 我想从图片中选择url和name,所以我要为此做两个子查询? 两个子查询会冒选择不同图片的风险。用另一种方法编辑答案。【参考方案2】:SELECT
g.id,
g.name,
u.username,
p.url
FROM
galleries g
INNER JOIN (SELECT DISTINCT
gallery_id,
(SELECT url FROM pictures ss WHERE ss.gallery_id = s.gallery_id
ORDER BY RAND() LIMIT 1) AS url
FROM
pictures s) p ON
g.id = p.gallery_id
LEFT OUTER JOIN users u ON
g.user_id = u.id
WHERE
g.active = 1
这个查询会出去并选择一个画廊,然后它会找到任何有图片的画廊(如果你想返回没有图片的画廊,将 INNER JOIN 更改为 LEFT OUTER JOIN 就可以了)。之后,它与用户一起加入。现在,当然,无论您拥有多少用户,这只小狗都会返回每个该死的画廊(哇!)。您可能希望在 WHERE 子句中限制用户(例如 -WHERE u.id = 123
)。否则,您将获得比预期更多的结果。或者对其进行 INNER JOIN。
【讨论】:
进行内部联接是否比 Andomar 解释的那样更好? 联接允许您返回多个列并在您的选择语句中使用这些列。我想可能是这样,这就是我这样做的原因。以上是关于mysql - 子查询和连接的主要内容,如果未能解决你的问题,请参考以下文章