2010-09-10 85 views
1

我想查詢一下,我可以檢索10行的間隔,每個標籤有5個標籤。MySQL:將查詢限制爲10行,其中每個索引有5個標籤

我已經housestags表,我知道如何僅對具有SELECT簡單的查詢使用LIMIT,但我怎麼能做到這一點在這種情況下做到這一點?

table houses 
id house   country 
1  Grunt Mansion us 
2  Hororo Suneku jp 
3  Casa Cattani  it 
4  Sweet Home  uk 
5  Heinzvaiter  de 
6  F56X-5   us 
7  Swan Jong  cn 
8  Drupnowevo  ru 
9  Bambagiador  br 
10 El Stanco  es 

table houses_tags 
id id_house id_tag 
1  1   1 
2  1   2 
3  1   3 
4  1   4 
5  2   1 
6  2   2 
7  2   3 
8  2   4 

table tags 
id tag 
1  minimal 
2  baroque 
3  cosy 
4  simple 

如果作出這樣一個查詢來獲取前10個房子:

SELECT * 
FROM houses 
LEFT JOIN (
    SELECT * 
    FROM tags 
    INNER JOIN houses_tags 
    ON id_house = houses.id 
    LIMIT 5 
) house_tag 
LIMIT 0, 10 

我得到的是這樣的:

query result 
row house   country tag  id_house  id_tag 
1  Grunt Mansion us   minimal 1   1 
2  Grunt Mansion us   baroque 1   2 
3  Grunt Mansion us   cosy  1   3 
4  Grunt Mansion us   simple 1   4 
5  Hororo Suneku jp   minimal 2   1 
6  Hororo Suneku jp   baroque 2   2 
7  Hororo Suneku jp   cosy  2   3 
8  Hororo Suneku jp   simple 2   4 
9  Casa Cattani  it   NULL  NULL   NULL 
10  Sweet Home  uk   NULL  NULL   NULL 

我的問題是我得到的只有前10從查詢中刪除最後一個houses的行,因爲第一個的tags佔用了所有行

我可以寫一個查詢,我可以檢索前10個房屋和每個標籤5個?

query result 
row house   country tag  id_house  id_tag 
1  Grunt Mansion us   minimal 1   1 
2  Grunt Mansion us   baroque 1   2 
3  Grunt Mansion us   cosy  1   3 
4  Grunt Mansion us   simple 1   4 
5  Hororo Suneku jp   minimal 2   1 
6  Hororo Suneku jp   baroque 2   2 
7  Hororo Suneku jp   cosy  2   3 
8  Hororo Suneku jp   simple 2   4 
9  Casa Cattani  it   NULL  NULL   NULL 
10  Sweet Home  uk   NULL  NULL   NULL 
11  Heinzvaiter  de   NULL  NULL   NULL 
12  F56X-5   us   NULL  NULL   NULL 
13  Swan Jong  cn   NULL  NULL   NULL 
14  Drupnowevo  ru   NULL  NULL   NULL 
15  Bambagiador  br   NULL  NULL   NULL 
16  El Stanco  es   NULL  NULL   NULL 

最後我應該需要一個結果,我顯示這樣的例子:

Mansions   Tags 
Grunt Mansion  minimal, baroque, cosy, simple 
Hororo Suneku  minimal, baroque, cosy, simple 
Casa Cattani  - 
Sweet Home  - 
Heinzvaiter  - 
F56X-5   - 
Swan Jong   - 
Drupnowevo  - 
Bambagiador  - 
El Stanco   - 

pages 1 | 2 | 3 

我能做到嗎?

回答

1

MySQL沒有解析函數,這是什麼你可以在LIMIT之前使用:

SELECT x.id, 
      x.house, 
      x.country, 
      x.id_tag 
     FROM (SELECT h.id, 
        h.house, 
        h.country, 
        ht.id_tag, 
        CASE 
        WHEN @id = h.id THEN @rownum := @rownum + 1 
        ELSE @rownum := 1 
        END AS rank, 
        @id := h.id, 
        @house_count := @house_count + 1 AS house_count 
       FROM HOUSE h 
     LEFT JOIN HOUSES_TAGS ht ON ht.id_house = h.id 
       JOIN (SELECT @rownum := 0, @id := -1, @house_count := 0) r 
      ORDER BY h.id, ht.id_tag) x 
    WHERE x.house_count <= 10 
    AND x.rank <= 4   
ORDER BY x.id, x.id_tag 
+0

感謝您的幫助,您還可以幫助我瞭解CASE和@vars語法與一些解釋鏈接,這將是非常有用的我。 – vitto 2010-09-13 18:59:40

+0

@Vittorio Vittori:MySQL [CASE文檔](http://dev.mysql.com/doc/refman/5.0/en/case-statement.html); @variable_name是一個變量。我使用笛卡爾積 - 'JOIN(SELECT @rownum:= 0,@id:= -1,@house_count:= 0)r' - 定義變量而不需要單獨的'SET'語句。 – 2010-09-13 19:17:22

+0

抱歉,延遲 – vitto 2010-10-10 10:32:27

1

我想你想你的子選擇給你回你想要的10分houseID的結果,然後就離開了加入對標記表中的子查詢(限5)

+0

+1。 – 2010-09-10 23:34:07

+0

感謝您的建議,但它似乎沒有改變結果,我的問題開始因爲我想得到10間房屋的間隔,包括每個標籤5個標籤,例如,如果我使用限制0,10在查詢結束我以爲MySql返回了結果而不計算子查詢行,但它似乎這樣做。我不知道如果我已經清楚(我希望!) – vitto 2010-09-10 23:46:20