mysql - SQL 查询查找表和指定条件之间的列列表中的公共(public)项?

标签 mysql sql

因为我读到在循环中使用查询不是一个好主意,所以我正在寻找一种使用 JOIN 和 GROUP by 等的方法。不知道能不能实现。

我有一个包含不同用户的表及其相应的列,其中包含不同类别中最喜欢的项目的列表。例如:

Column 1 : usernames
Column 2 :  Food - contains a list of the user’s favorite food
Column 3 : Sports - contains a list of the user’s favorite sports
Column 4 : Music - contains a list of the user’s favorite music

现在假设我已经有了一些标准,我想知道它是否与所有列都匹配:

Column 2 :  contains any of the following: peaches, pears, apples
Column 3 : contains any of the following: football, baseball,   basketball
Column 4 : contains any of the following: jazz, rock

我的问题是:是否可以生成一个 SQL 查询来告诉我用户以及用户每一列的常用项?我想知道用户在每列中匹配了多少个项目,以及每列匹配的项目的名称是什么。如果可能的话,您会采取什么步骤来做到这一点?谢谢。

最佳答案

该解决方案名为 data normalization 。你会有

Table Users
ID    Name
1     John
2     Bea

Table Sport
ID    NameOfTheGame
1     Hockey
2     Football

Table Food
ID    Dishname
1     Spaghetti
2     Apples


Table SportPrefs
ID    FK_ID_Users  FK_ID_Sport
1     1            2            # John preferes Football
2     1            1            #      and hockey
3     2            2            # Bea only hocky 


Table FoodPrefs 
ID    FK_ID_Users  FK_ID_Sport
....  ...           ... 

然后就可以查询了

select * 
from Users 
join SportPrefs on Users.Id == SportPrefs.FK_ID_Users
join Sport on SportPrefs.FK_ID_Sport == Sport.ID
WHERE ....

在处理基于 SQL 的数据库时,在列中存储“逗号分隔”或任何内容列表通常是一个坏主意 - 这样连接/查询和编辑就会变得复杂 - 想想如果有人突然不喜欢他的 20 个中的一个该怎么办您喜欢的菜肴,您必须从一长串文本中进行编辑。

日期规范化可帮助数据库构建良好的索引以快速获得结果 - 并有助于您保持理智,因为您的 sql 比使用其中的字符串操作更容易处理。

编辑:

有多种方法可以对数据进行建模(以及数据标准化)。

你也可以这样建模:

Table WhatIsIt
ID    Name
1     Sport
2     Food
3     Music

Table WhatUserLikes
ID    FK_ID_WhatIsIT    FK_ID_Users  Description
1     1                 2            Handball
2     1                 2            Golf
3     2                 2            Burgers
4     2                 2            Icecream
5     2                 2            Yellyfish
6     3                 1            ABBA
.... 

要了解它的作用,比使用不同的食物、运动和音乐表(我可能更喜欢)要复杂一些

关于mysql - SQL 查询查找表和指定条件之间的列列表中的公共(public)项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47775525/

相关文章:

php - 我应该如何在 mysql 中执行此查询

php - 1美元和2美元是什么意思?

mysqldump 使用终端 ubuntu 将数据库备份恢复到空数据库

mysql - 获取每个类别的最后 n 个条目

mysql - 未知的 MySQL 服务器主机 'db' Rails 和 Docker

Python:无法迭代模拟对象中的模拟数据库值

php - PHP Store不显示产品

php - 从两列中计算最多的记录

mysql - AWS EC2 Crontab 自动备份 RDS MySQL 数据库

java - 将mysql分成几组进行交叉验证