MYSQL语句

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

我想选择与当前用户具有相同城市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 = '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)与两列结果集(idcountry\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')