我想查询一下,我可以检索10行的间隔,每行有5个标签。
我有houses
和tags
表,我知道如何只使用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
我能做到吗?
答案 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