2011-04-21 64 views
3

我想選擇與當前用戶具有相同city_id和country_id的用戶。MYSQL聲明

我故意允許國家和城市獨立,因爲一些靈活性的原因。

是不是看起來像這樣?

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') 

任何想法請問?

+0

你在正確的軌道上 - 任何更具體的問題? – Diarmaid 2011-04-21 14:19:55

+0

我認爲有一種更專業,更有效,更快,更短的方法。 – 2011-04-21 14:21:02

+0

@Diarmaid你確定他是?他選擇兩個字段與「=」比較中使用的子查詢。這絕對不是正確的軌道;) – 2011-04-21 14:30:32

回答

4
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' 
+0

+1 - 使用'JOIN's應該比子查詢有更好的性能。 – Piskvor 2011-04-21 14:25:08

+0

其實,@Piskvor,這是一個神話。在子查詢爲主查詢的每一行返回_different_ rowsets的情況下,通常就是這種情況(比如'where childcolumn = parentquery.something')。但是在子查詢不變的情況下(比如current_id是常量的情況),任何像樣的DBMS都應該基本上只運行兩個盲目快速的查詢(假設'id'當然是索引的),然後是主查詢。我知道DB2是這樣做的。不確定其他DBMS'。 – paxdiablo 2011-04-21 14:30:46

+0

@Piskvor,@paxdiablo:出於好奇,我在一個地址表上用Microsoft SQL Server對兩個版本進行了測試,只有超過0.5M行,並且*如果* city_id和country_id被索引,那麼這個連接版本勝過子查詢版本。 – 2011-04-21 14:52:10

1

首先,您不應該在子查詢中選擇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') 
0

弗蘭克,

.. WHERE country_id = (SELECT id,country_id FROM users .. 

您比較單一值(COUNTRY_ID)到兩列的結果集(IDcountry_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')