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

时间:2015-06-20 17:26:21

标签: mysql left-join

我有以下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

返回重复行。

目标是检索所有用户是否存在,所有用户都遵循所有带限制来执行某些分页结果。

我必须检索:

{
    "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"
        }
    ]
}

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

2 个答案:

答案 0 :(得分:1)

尝试下面一次,尝试通过删除不必要的子查询并从中移动条件来修改查询 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; 

答案 1 :(得分:0)

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

您加入太多:所有关注者两次,频段无理由加入。

如果您想要"以及"的所有实例,您应该逻辑地从相关表开始:

SELECT * from band_followers

然后加入乐队和用户表:

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'