MYSQL语句
我想选择与当前用户具有相同城市id和国家id的用户 由于一些灵活性的原因,我故意允许国家和城市独立 它看起来像这样吗MYSQL语句,mysql,sql,Mysql,Sql,我想选择与当前用户具有相同城市id和国家id的用户 由于一些灵活性的原因,我故意允许国家和城市独立 它看起来像这样吗 SELECT id, country_id, city_id, surname FROM users WHERE country_id = (SELECT id,country_id FROM users WHERE id = 'current_user') AND city_id = (SELECT id, city_id FROM users WHERE id
SELECT id, country_id, city_id, surname FROM users WHERE
country_id = (SELECT id,country_id FROM users WHERE id = 'current_user') AND
city_id = (SELECT id, city_id FROM users WHERE id = 'current_id')
有什么想法吗?选择u2.id、u2.country\u id、u2.city\u id、u2.姓氏
SELECT u2.id, u2.country_id, u2.city_id, u2.surname
FROM users u1
INNER JOIN users u2
ON u1.country_id = u2.country_id
AND u1.city_id = u2.city_id
AND u1.id <> u2.id
WHERE u1.id = 'current_id'
来自用户u1
内部连接用户u2
关于u1.country\u id=u2.country\u id
u1.city\u id=u2.city\u id
和u1.id u2.id
其中u1.id='当前\u id'
首先,您不应该在子查询中选择id
字段
相反,请考虑使用以下方法:
SELECT id, country_id, city_id, surname
FROM users
WHERE country_id = (SELECT country_id FROM users WHERE id = 'current_id')
AND city_id = (SELECT city_id FROM users WHERE id = 'current_id')
弗兰克
您正在将单个值(country\u id)与两列结果集(id,country\u id)进行比较。这是错误的
您重新编写的查询将是:
SELECT id,country_id,city_id,surname FROM users WHERE country_id = (SELECT country_id FROM users WHERE id = 'current_user') AND city_id = (SELECT city_id FROM users WHERE id = 'current_id')
你的思路是对的——还有更具体的问题吗?我在想有一种更专业、更有效、更快、更短的方法。@Diarmaid你确定他是吗?他选择了两个字段,其中一个子查询用于“=”比较。这绝对不是一条正确的道路;)+1-使用
JOIN
s应该比子查询提供更好的性能。事实上,@Piskvor,这是一个神话。在子查询为主查询的每一行返回不同行集的情况下,通常会出现这种情况(例如其中childcolumn=parentquery.something
)。但是在子查询不改变的情况下(例如当前_id是常量的情况),任何好的DBMS基本上应该只运行两个盲目快速的查询(当然假设id
被索引),然后是主查询。我知道DB2可以做到这一点。不确定是否有其他DBMS.@Piskvor,@paxdiablo:出于好奇,我在Microsoft SQL Server上的一个地址表上尝试了这两个版本,该地址表的行数刚刚超过0.5M,如果城市id和国家id都被索引,然后,此连接版本的性能优于子查询版本。OP似乎并不反对将id为'current_id'的用户包含到输出中,因此和u1.id u2.id
可能是没有根据的。谢谢大家。实际上,和u1.id u2.id很重要,因为它可以防止“当前_id”包含在结果中。
SELECT id,country_id,city_id,surname FROM users WHERE country_id = (SELECT country_id FROM users WHERE id = 'current_user') AND city_id = (SELECT city_id FROM users WHERE id = 'current_id')