左连接语句中子查询的重复条目

duplicate entries on a sub query in left join statement

我有以下 SQL 查询:

SELECT band.id bid, band.name, bandInfo.summary, bandImage.url bandImage, 
user.id uid, user.username, userImage.url userImage
FROM bands AS band
INNER JOIN band_info AS bandInfo ON band.id = bandInfo.bid
LEFT JOIN band_image AS bandImage ON band.id = bandImage.bid
LEFT JOIN band_followers AS follower ON follower.bid = band.id
LEFT JOIN users AS user ON user.id IN (SELECT * FROM (SELECT user.id FROM users AS user, bands AS band, band_followers AS follower WHERE user.id = follower.uid) AS temp) AND user.activated = 1
LEFT JOIN user_info AS userInfo ON userInfo.uid = user.id
LEFT JOIN user_image AS userImage ON user.id = userImage.uid
WHERE (band.activated = 1) AND (bandInfo.language = 'fr')
ORDER BY band.name

其中 returns 我复制了一行。

目标是检索所有用户(如果存在),它遵循所有波段,并限制做一些分页结果。

我必须检索:

{
    "table": "Table inconnue",
    "rows":
    [
        {
            "bid": 1,
            "name": "Children Of Bodom",
            "summary": "Children of Bodom est un groupe de metal finlandais. Les cinq membres du groupe sont originaires d'Espoo, une ville finlandaise voisine d'Helsinki. Le groupe ne s’appelle ainsi que depuis 1997, avant quoi il s’appelait Inearthed. La mascotte du groupe est affectueusement appelée Roy et représente l'image folklorique de la mort, la faucheuse. Il est présent sur toutes les couvertures d'albums jusqu'à présent. <a href="http://www.last.fm/music/Children+of+Bodom">Read more about Children of Bodom on Last.fm</a>.",
            "bandImage": "http://userserve-ak.last.fm/serve/500/87864171/Children+of+Bodom+band.png",
            "uid": 1,
            "username": "everytimeicob",
            "userImage": "xxxxxxxxx"
        },
        {
            "bid": 1,
            "name": "Children Of Bodom",
            "summary": "Children of Bodom est un groupe de metal finlandais. Les cinq membres du groupe sont originaires d'Espoo, une ville finlandaise voisine d'Helsinki. Le groupe ne s’appelle ainsi que depuis 1997, avant quoi il s’appelait Inearthed. La mascotte du groupe est affectueusement appelée Roy et représente l'image folklorique de la mort, la faucheuse. Il est présent sur toutes les couvertures d'albums jusqu'à présent. <a href="http://www.last.fm/music/Children+of+Bodom">Read more about Children of Bodom on Last.fm</a>.",
            "bandImage": "http://userserve-ak.last.fm/serve/500/87864171/Children+of+Bodom+band.png",
            "uid": 2,
            "username": "noob",
            "userImage": "xxxxxxxx"
        },
        {
            "bid": 2,
            "name": "Veil Of Maya",
            "summary": "Veil of Maya is a good band",
            "bandImage": null,
            "uid": 1,
            "username": "everytimeicob",
            "userImage": "xxxxxx"
        }
    ]
}

但我检索到:

{
    "table": "Table inconnue",
    "rows":
    [
        {
            "bid": 1,
            "name": "Children Of Bodom",
            "summary": "Children of Bodom est un groupe de metal finlandais. Les cinq membres du groupe sont originaires d'Espoo, une ville finlandaise voisine d'Helsinki. Le groupe ne s’appelle ainsi que depuis 1997, avant quoi il s’appelait Inearthed. La mascotte du groupe est affectueusement appelée Roy et représente l'image folklorique de la mort, la faucheuse. Il est présent sur toutes les couvertures d'albums jusqu'à présent. <a href="http://www.last.fm/music/Children+of+Bodom">Read more about Children of Bodom on Last.fm</a>.",
            "bandImage": "http://userserve-ak.last.fm/serve/500/87864171/Children+of+Bodom+band.png",
            "uid": 1,
            "username": "everytimeicob",
            "userImage": "xxxxxxxxx"
        },
        {
            "bid": 1,
            "name": "Children Of Bodom",
            "summary": "Children of Bodom est un groupe de metal finlandais. Les cinq membres du groupe sont originaires d'Espoo, une ville finlandaise voisine d'Helsinki. Le groupe ne s’appelle ainsi que depuis 1997, avant quoi il s’appelait Inearthed. La mascotte du groupe est affectueusement appelée Roy et représente l'image folklorique de la mort, la faucheuse. Il est présent sur toutes les couvertures d'albums jusqu'à présent. <a href="http://www.last.fm/music/Children+of+Bodom">Read more about Children of Bodom on Last.fm</a>.",
            "bandImage": "http://userserve-ak.last.fm/serve/500/87864171/Children+of+Bodom+band.png",
            "uid": 1,
            "username": "everytimeicob",
            "userImage": "xxxxxxxxx"
        },
        {
            "bid": 1,
            "name": "Children Of Bodom",
            "summary": "Children of Bodom est un groupe de metal finlandais. Les cinq membres du groupe sont originaires d'Espoo, une ville finlandaise voisine d'Helsinki. Le groupe ne s’appelle ainsi que depuis 1997, avant quoi il s’appelait Inearthed. La mascotte du groupe est affectueusement appelée Roy et représente l'image folklorique de la mort, la faucheuse. Il est présent sur toutes les couvertures d'albums jusqu'à présent. <a href="http://www.last.fm/music/Children+of+Bodom">Read more about Children of Bodom on Last.fm</a>.",
            "bandImage": "http://userserve-ak.last.fm/serve/500/87864171/Children+of+Bodom+band.png",
            "uid": 2,
            "username": "noob",
            "userImage": "xxxxxxxx"
        },
        {
            "bid": 1,
            "name": "Children Of Bodom",
            "summary": "Children of Bodom est un groupe de metal finlandais. Les cinq membres du groupe sont originaires d'Espoo, une ville finlandaise voisine d'Helsinki. Le groupe ne s’appelle ainsi que depuis 1997, avant quoi il s’appelait Inearthed. La mascotte du groupe est affectueusement appelée Roy et représente l'image folklorique de la mort, la faucheuse. Il est présent sur toutes les couvertures d'albums jusqu'à présent. <a href="http://www.last.fm/music/Children+of+Bodom">Read more about Children of Bodom on Last.fm</a>.",
            "bandImage": "http://userserve-ak.last.fm/serve/500/87864171/Children+of+Bodom+band.png",
            "uid": 2,
            "username": "noob",
            "userImage": "xxxxxxxxx"
        },
        {
            "bid": 2,
            "name": "Veil Of Maya",
            "summary": "Veil of Maya is a good band",
            "bandImage": null,
            "uid": 1,
            "username": "everytimeicob",
            "userImage": "xxxxxxxx"
        },
        {
            "bid": 2,
            "name": "Veil Of Maya",
            "summary": "Veil of Maya is a good band",
            "bandImage": null,
            "uid": 2,
            "username": "noob",
            "userImage": "xxxxxxx"
        }
    ]
}

这里有人有想法吗?我必须限制用户关注乐队的结果

像下面这样尝试一次,尝试通过删除不必要的子查询并将条件从 WHERE 子句到 JOIN ON 子句

SELECT band.id as bid, 
band.name, 
bandInfo.summary, 
bandImage.url as bandImage, 
u.id as uid, 
u.username, 
userImage.url as userImage
FROM bands AS band
INNER JOIN band_info AS bandInfo ON band.id = bandInfo.bid AND bandInfo.language = 'fr'
LEFT JOIN band_image AS bandImage ON band.id = bandImage.bid
LEFT JOIN band_followers AS follower ON follower.bid = band.id
LEFT JOIN (
SELECT user.id,
user.username
FROM users AS user
WHERE user.activated = 1
LIMIT 10
) u ON u.id  = follower.uid
LEFT JOIN user_info AS userInfo ON userInfo.uid = u.id
LEFT JOIN user_image AS userImage ON u.id = userImage.uid
WHERE band.activated = 1 
ORDER BY band.name; 
LEFT JOIN band_followers AS follower ON follower.bid = band.id
LEFT JOIN users AS user ON user.id IN (SELECT * FROM 
(SELECT user.id FROM users AS user, 
bands AS band, band_followers AS follower 
WHERE user.id = follower.uid) AS temp) AND user.activated = 1

你加入的太多了:所有 followers 两次,bands 没有理由。

如果您想要 "following" 的所有实例,从逻辑上讲,您应该从相关的 table:

开始
SELECT * from band_followers

然后加入乐队和用户tables:

SELECT 
    band_followers.uid, 
    bands.id bid, bands.name,
    user.username,
    band_info.summary, band_image.url burl,
    user_image.url uurl
FROM 
    band_followers
    INNER JOIN bands on band_followers.bid=bands.id
    INNER JOIN band_info on band_info.bid=bands.id
    INNER JOIN band_image on band_image.bid=bands.id
    INNER JOIN users on users.id=band_followers.uid
    INNER JOIN user_image on user_image.uid=band_followers.uid

INNER JOIN 假设所有字段都是必填的。 最后加上条件:

SELECT 
    band_followers.uid, 
    bands.id bid, bands.name,
    user.username,
    band_info.summary, band_image.url burl,
    user_image.url uurl
FROM 
    band_followers
    INNER JOIN bands on band_followers.bid=bands.id
    INNER JOIN band_info on band_info.bid=bands.id
    INNER JOIN band_image on band_image.bid=bands.id
    INNER JOIN users on users.id=band_followers.uid
    INNER JOIN user_image on user_image.uid=band_followers.uid
WHERE 
    bands.activated=1
    AND users.activated = 1
    AND band_info.language = 'fr'