【问题标题】:Determining what's on a Many to Many relationship确定多对多关系的内容
【发布时间】:2013-11-07 21:58:01
【问题描述】:

这可能是一个简单的答案,但在过去的几天里,我一直在解决这个问题,它开始让我发疯了

我有一个多对多关系的数据库

------------- --------- ---------------- --- |图片 | |user2img | |用户 | ------------- --------- ---------------- --- |imgID | |标识 | |用户名 | |imgURL | |imgID | |用户名 | |imgAv | |用户名 | |用户邮箱 | ------------- --------- ---------------- ---

user2img 表指示允许用户查看哪个图像。

我正在尝试确定一个 SQL 查询,该查询将列出每个图像(一次不重复)并告诉我指定用户是否有权查看该图像。

这样的输出,

(WHERE 用户 ID = '1')

---------------------------- |imgID |网址 |访问 | ---------------------------- |1 | xxx |是 | |2 |年年 |没有 | |3 | QQ |是 | |4 | rrr |是 | |5 |万维网 |没有 | |6 | sss |是 | 等等... ----------------------------

谢谢,

【问题讨论】:

    标签: mysql list many-to-many database-relations definitions


    【解决方案1】:

    一种可能性是(我承认不是最好的,也可能不是很有效)为用户选择所有匹配的图像,在复合键表上进行内部连接,UNION 使用否定选择的结果(iid 是我测试表中的 imageId):

    select 
        iid, url, 'yes'
        from user_has_image
        inner join image on user_has_image.iid = image.id
        inner join user on user_has_image.uid = user.id
        where user.id = 1
    union
    select 
        iid, url, 'no'
        from user_has_image
        inner join image on user_has_image.iid = image.id
        inner join user on user_has_image.uid = user.id
        where user.id <> 1
    

    你可以在这个SQLFiddle session看到结果。

    【讨论】:

    • 这也不会给我一个输出,其中包含所有 ID 不为 1 的用户(用户 2、3、4、5、6、7、8 等)。 .. 以及未在 user2img 表中列出的用户未列出的 imgs?
    • 是的,但是在您的问题示例中-如果 user2image 表中没有映射,所有用户都不是这种情况吗?如果 UserId NOT 出现在表中,则用户无权访问该图像。否定问题没有其他解决方案。您可以将 UNION 重写为 leftright 加入,但它是相同的 - UserId 为空的每个结果都将是 user2image 表中所有其他用户的图像.我认为您只需要检查访问权限 - 如果存在使用 inner joinconnection
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    相关资源
    最近更新 更多