因为我读到在循环中使用查询不是一个好主意,我正在寻找一种方法来使用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查询,该查询可以告诉我每个列的用户和用户的常用项目?我想知道用户在每列中匹配了多少项,以及每列匹配的项的名称是什么。如果可以,你会采取什么样的步骤来做到这一点?感谢。
答案 0 :(得分:1)
该解决方案名为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的数据库时,存储“逗号分隔”或列中的任何事物列表通常是一个坏主意 - 加入/查询和编辑变得那么复杂 - 想想如果有人突然不喜欢他的一个,该怎么办喜欢的菜肴,您必须从一长串文本中进行编辑。
Datenormalization帮助数据库构建漂亮的索引以获得快速的结果 - 并且有助于您的理智,因为您的sql更容易处理,然后使用其中的字符串操作。
编辑:
有几种方法可以建模数据(以及DataNormalization)。
你也可以这样建模:
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
....
虽然这对于食物,体育和音乐有不同的表格(我可能会优先考虑),但是这样做会稍微复杂一些。