程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组?

开发过程中遇到SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组的问题如何解决?下面主要结合日常开发的经验,给出你关于SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组的解决方法建议,希望对你解决SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组有所启发或帮助;

我有两张数据库表,一张作为主表,另一张作为关系表。 第一个表是目录,第二个表是连接到用户或组的表。 第二个表中的一些数据也可能会被修改。

我不确定结构和性能。

例如,我们有用户 ID 160,它在组 ID 7 下

首先,我们有一个 post 表。

ID  |  title  |  content    |   cover  | status
------------------------------------------------
1   | first   |  content 1  | /img/... |   1
2   | second  |  content 2  | /img/... |   1
3   | another |  content 3  | /img/... |   1
4   | four    |  content 4  | /img/... |   1
5   | five    |  content 5  | /img/... |   1

第二个我们有一个 post_rel 表:

ID  | group_ID | user_iD | post_ID |  title   |   cover  | sort | status
---------------------------------------------------------------------------
1   | 7        | NulL    | 1       | g title  | img/...  | 1    | 1
2   | NulL     | 160     | 1       | u title  | NulL     | 2    | 1     ***  SELEcted for user_iD
3   | 7        | NulL    | 2       | NulL     | img/...  | 6    | 0
4   | NulL     | 160     | 2       | NulL     | img/...  | 4    | 1     ***  SELEcted for user_iD
5   | NulL     | 160     | 3       | some     | img/...  | 3    | 1     ***  SELEcted for user_iD
6   | 7        | NulL    | 4       | NulL     | img/...  | 9    | 1     ***  SELEcted for group_ID
7   | NulL     | 165     | 5       | NulL     | img/...  | 5    | 0

这是我们的基本查询。

SELEct 
    `post_rel`.`title` as `custom_title`,`post_rel`.`cover` as `custom_cover`,`post_rel`.`group_ID`,`post_rel`.`user_iD`,`post`.* 
from 
    `post` 
        inner join `post_rel` on `post`.`ID` = `post_rel`.`post_ID` 
        where 
            `post`.`status` = 1 
            and `post_rel`.`status` = 1 
            and ( 
                `post_rel`.`user_iD` = 160 
                or ( 
                    `post_rel`.`group_ID` = 7 
                    and `post_rel`.`post_ID` not in (
                            SELEct 
                                `post_rel`.`post_ID` 
                            from 
                                `post_rel` 
                            where 
                                `post_rel`.`user_iD` = 160
                    )
                )
            )
order by 
    `post_rel`.`sort` asc

那么,您对基本查询有何看法?尤其是在子查询中,在大表中性能不会下降吗?是否可以编写更好更简单的查询或更改结构?

编辑:这是我的代码和结构的 sqlfiddle 示例 http://sqlfiddle.com/#!9/ed9d4b/1

解决方法

我会将其更改为使用“不存在”而不是“不存在”并使用别名,这样我就可以像这样将其关闭:

SELEct 
    b.`title` as `custom_title`,b.`cover` as `custom_cover`,b.`group_id`,b.`user_id`,a.* 
from 
    `post` a
        inner join `post_rel` b on a.`id` = b.`post_id` 
        where 
            a.`status` = 1 
            and b.`status` = 1 
            and ( 
                b.`user_id` = 160 
                or ( 
                    b.`group_id` = 7 
                    and not exists (
                            SELEct 
                                'x' 
                            from 
                                `post_rel` c
                            where 
                                c.`user_id` = 160 and c.`post_id`=b.`post_id`
                    )
                )
            )
order by 
    b.`sort` asc

通常在管理用户和群组时,会有一个例外用户的概念,该用户可以像整个群组一样直接分配资产。这似乎就是一个例子。

从仅建模的角度来看,有两种方法可以解决这个问题:

  1. 确保每个用户都存在于一个组中,并且您只将资产分配给组。对于例外用户,创建一个组。您甚至可以强制每个用户只属于一个组。这样你的 post_rel 表只处理组。不幸的是,人们对群组和用户之间的关系了解得不够透彻,无法进行适当的权衡。

  2. 仅出于消除空值的需要以实现良好的模型,这也减少了开销,另一种选择是使用名称值对并允许用户和组与除它之外的另一个字段存在于同一字段中,表示组或用户。 这些是 SQL 小提琴:

不存在版本:http://sqlfiddle.com/#!9/1af8cf/2

不在版本中:http://sqlfiddle.com/#!9/1af8cf/1

一些关于空值的阅读https://dev.mysql.com/doc/refman/5.6/en/data-size.html

特别是:

如果可能,将列声明为 NOT NULL。通过更好地使用索引并消除测试每个值是否为 NULL 的开销,它使 SQL 操作更快。您还可以节省一些存储空间,每列一位。如果您的表中确实需要 NULL 值,请使用它们。只需避免在每列中允许 NULL 值的默认设置。

大佬总结

以上是大佬教程为你收集整理的SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组全部内容,希望文章能够帮你解决SQL - 由用户自己从多对多关系中获取记录 - 或 - 他的组所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:-