因为我读到在循环中使用查询不是一个好主意,所以我正在寻找一种使用 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/