MySQL left join with 'b's limit
Posted
技术标签:
【中文标题】MySQL left join with \'b\'s limit【英文标题】:MySQL left join with 'b's limitMySQL left join with 'b's limit 【发布时间】:2017-04-25 19:18:02 【问题描述】:首先,对不起,我的英语错误。
我有一个关于 mysql 查询加入 b.limit 的问题 显示下面两个表格
表 1:成员
id INT NOT NULL 主键 用户名 VARCHAR(100) 非空 ...
表 2:Members_opt
id INT NOT NULL 主键 members_id VARCHAR(100) 非空 类别 varchar(10) NOT NULL ...
并且一个用户有多个成员选择列。 和 Members.id = Members_opt.members_id。
我想做这个查询
SELECT * FROM Members a, Members_opt b WHERE a.id = b.members_id;
但是这个查询会产生以下结果。
id | user_name | category
01 | John | cat
01 | John | dog
01 | John | bird
02 | olion | cat
03 | jenny | dog
我想要结果是否具有相同的 id 值,只需将“limit 0,1”添加到类别 所以我想要这个结果。
01 | John | cat
02 | olion | cat
03 | jenny | dog
我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:JOIN
操作表示两个表中所有可能的行组合。因此,如果 John 有一只狗、一只猫和一只鸟,并且您执行普通的 JOIN,您将得到 John 的三行。
(SELECT .. FROM a,b WHERE a.something=b.something
是 JOIN
。它使用老式语法但仍然是 JOIN
)。
为了满足您的要求,您需要一种方法来获取一个虚拟表(子查询),每个成员只包含一个宠物。
SELECT members_id,
MAX(category) category
FROM Members_opt
GROUP BY members_id
会这样做。它选择名称在字母表中最后的类别(宠物)。每个 members_id 值最多返回一行。
然后你将那个虚拟表(子查询)加入到你的另一个表中。
SELECT a.id, a.user_name, b.category
FROM Members a
JOIN (
SELECT members_id,
MAX(category) category
FROM Members_opt
GROUP BY members_id
) b ON a.id = b.members_id
这将为每个显示所选类别的成员返回一行。如果成员没有类别(没有宠物),则此查询将禁止该成员的行。如果您希望查询显示没有宠物的成员,请使用 LEFT JOIN。
注意这个查询
SELECT * /* incorrect: nonstandard, unpredictable */
FROM Members a, Members_opt b
WHERE a.id = b.members_id
GROUP BY a.id
滥用了对 MySQL 的 GROUP BY
实现的非标准扩展。它不适用于较新版本的 MySQL,而是会出错。如果它确实有效,它将返回不可预测的结果。读这个。 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
返回不可预测的结果比返回随机结果更糟糕。当你在 MySQL 中滥用这个 GROUP BY
hack 时,每次后续使用查询都会返回相同的结果,直到它不返回。
【讨论】:
【参考方案2】:您可以使用group by
子句:
SELECT *
FROM Members a, Members_opt b
WHERE a.id = b.members_id
GROUP BY a.id
但是如果你使用这个,b 的任何条目都可以被选中。不是说 ID 01 总是从表 b 中获取条目 'cat'。
【讨论】:
是的!我喜欢!我要这个。问题解决了:)谢谢akrys! 是否可以添加“ORDER BY b.id ASC”? 您可以在group by
子句之后添加任何order by
,它看起来像GROUP BY a.id ORDER BY b.id ASC
。我不确定它是否有用
"GROUP BY a.id ORDER BY b.id ASC" 它有效!谢谢:)以上是关于MySQL left join with 'b's limit的主要内容,如果未能解决你的问题,请参考以下文章
Mysql LEFT JOIN with count 返回未知列
Mysql left join with nested select慢,如何优化
mysql left join to table with multiple rows on min id 以确保返回单行
MySQL LEFT JOIN with SUM before a date and SUM before and at that date