2014-01-20 22 views
0

我有一個位置(城市)表和一個用戶表。我需要從3個頂級城市(其中一個城市被視爲前3名,取決於其中有多少用戶)和城市信息中檢索3名頂級用戶。例如:查詢從SQL中排名前三位的城市中排名前三位的用戶

邁阿密(Q = 95000)

  1. 安德烈
  2. 黛布拉摩根
  3. 加布裏埃拉

紐約(Q = 74000)

  1. 桑迪
  2. Carsie
  3. 梅根

聖地亞哥(Q = 26500)

  1. 烏爾蘇拉
  2. 拉馬納
  3. 羅米納

這是我當前的查詢:

SELECT l.city, l.q, u.name 
FROM location AS l JOIN user AS u 
ON l.id_location = u.id_location 
ORDER BY q DESC 
LIMIT 3 

最明顯的問題是,它只是把我從上1個城市前3名用戶。有任何想法嗎?

這些是表:

位置

  • id_location
  • 名稱
  • Q(用戶量)

用戶

  • id_user
  • 圖片
+0

正確的,謝謝! – andufo

+0

你怎麼知道哪個城市的前三名用戶?有沒有可用於訂購用戶的字段? – fthiella

回答

1

你可以使用GROUP_CONCAT功能來連接所有用戶,SUBSTRING_INDEX返回只有前三個用戶:

SELECT 
    l.city, l.q 
    SUBSTRING_INDEX(
    GROUP_CONCAT(u.name ORDER BY field_to_order DESC), ',', 3 
) AS top_3_users 
FROM 
    location AS l JOIN user AS u 
    ON l.id_location = u.id_location 
GROUP BY 
    l.city, l.q 
ORDER BY 
    l.q DESC 
LIMIT 3 

結果將是像這樣:

Miami  95000 Andrea, Debra Morgan, Gabriela 
New York 74000 Sandy, Carsie, Megan 
San Diego 26500 Ursula, Ramona, Romina 

編輯,如果你還需要用戶的圖片,圖片是VARCHAR,那麼你可以使用GROUP_CONCAT也對現場:

SELECT 
    l.city, l.q 
    SUBSTRING_INDEX(
    GROUP_CONCAT(u.name ORDER BY field_to_order DESC), ',', 3 
) AS top_3_users, 
    SUBSTRING_INDEX(
    GROUP_CONCAT(u.picture ORDER BY field_to_order DESC), ',', 3 
) AS top_3_pictures 
FROM 
    location AS l JOIN user AS u 
    ON l.id_location = u.id_location 
GROUP BY 
    l.city, l.q 
ORDER BY 
    l.q DESC 
LIMIT 3 
+0

忘了告訴你,我還需要用戶的圖片字段:s – andufo

+0

@andufo是圖片的一個varchar字段?或者它是二元的? – fthiella

+0

它是一個varchar(255) – andufo