-1

我有从我的表中选择的结果:

id  tag
1   hey
1   wow
2   cry
87   game
87   bmw
6   lady
7   wow

但是我通过 JOIN 得到了这个结果。我的完整 SQL 查询:

SELECT sites.id, sites.host, sites.url, sites.password, sites.status, sites.pr, sites.tyc, sites.alexa, sites.lastcheck, sites.comment, tags.tagname, tags.tagid FROM sites
LEFT JOIN sites_tags ON sites_tags.shellid = sites.id 
LEFT JOIN tags ON sites_tags.tagid = tags.tagid

对于分页,我需要来自查询的 3 个实际数据。

如果我的查询 - LIMIT 3,我想得到

1   hey
1   wow
2   cry
87   game
87   bmw

但不是

 1   hey
 1   wow
 2   cry

例如,我需要所有受 ID 限制的结果,而不是行。

抱歉英语不好。

4

2 回答 2

2
SELECT 
    s.id, 
    s.host, 
    s.url, 
    s.password, 
    s.status, 
    s.pr, 
    s.tyc, 
    s.alexa, 
    s.lastcheck, 
    s.comment, 
    tags.tagname, 
    tags.tagid 
FROM (
    SELECT
        id, 
        host, 
        url, 
        password, 
        status, 
        pr, 
        tyc, 
        alexa, 
        lastcheck, 
        comment
    FROM sites
    LIMIT 3
) s
LEFT JOIN sites_tags ON sites_tags.shellid = s.id 
LEFT JOIN tags ON sites_tags.tagid = tags.tagid

这假设您想要的是与 3 个站点相关的标签。这将选择 3 个站点的站点信息,然后还将选择任何标记(如果有)。

但是它不会准确地返回您想要的内容,您最好按一个查询来选择所有字段sites

SELECT
    id, 
    host, 
    url, 
    password, 
    status, 
    pr, 
    tyc, 
    alexa, 
    lastcheck, 
    comment
FROM sites
LIMIT 3

然后第二次执行以下操作以获取这些站点的标签。

SELECT 
    sites_tags.shellid AS id, 
    tags.tagname, 
    tags.tagid 
FROM sites_tags
INNER JOIN tags ON sites_tags.tagid = tags.tagid
WHERE sites_tags.shellid IN (..... your ids go here ......)
于 2012-04-17T12:05:25.537 回答
1

(猜测id指的是sites.id

替换FROM sites为:

FROM ( SELECT * 
       FROM sites 
       ORDER BY whatever 
       LIMIT 3
     ) AS sites
于 2012-04-17T12:05:04.383 回答