MySQL:将查询限制为10行,其中每个索引都有5个标记

时间:2010-09-10 23:22:03

标签: php mysql select greatest-n-per-group

我想查询一下,我可以检索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占据了所有行

我可以写一个查询,在那里我可以检索前10个房子和每个房子5个标签吗?

tags

最后,我需要一个像我这样显示的结果:

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
我能做到吗?

2 个答案:

答案 0 :(得分:1)

我想你希望你的subselect给你回到你想要的结果的10个houseID,然后只是左边连接标签表subselect(限制5)

答案 1 :(得分: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