SQL查询在表和指定条件之间的列列表中查找公共项?

时间:2017-12-12 14:55:08

标签: 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查询,该查询可以告诉我每个列的用户和用户的常用项目?我想知道用户在每列中匹配了多少项,以及每列匹配的项的名称是什么。如果可以,你会采取什么样的步骤来做到这一点?感谢。

1 个答案:

答案 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
.... 

虽然这对于食物,体育和音乐有不同的表格(我可能会优先考虑),但是这样做会稍微复杂一些。