SQL-запрос для поиска общих элементов в списках столбцов между таблицей и указанными критериями?

0

Поскольку я читал, что использование запроса в цикле не является хорошей идеей, я ищу способ использовать JOINs и GROUP by и т.д. Вместо этого. Я не уверен, что это можно сделать.

У меня есть таблица с разными пользователями и их соответствующие столбцы, содержащие списки любимых элементов в разных категориях. Например:

Column 1 : usernames
Column 2 :  Food - contains a list of the users favorite food
Column 3 : Sports - contains a list of the users favorite sports
Column 4 : Music - contains a list of the users 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 ответ

1
Лучший ответ

Решение называется нормировкой данных. Вам придется

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 любимых блюд и вы должны отредактировать это из длинного списка текста.

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

Чтобы понять, что это делает, это немного сложнее, но, несмотря на то, что у меня есть разные таблицы для Food, Sport and Music (которые я, вероятно, предпочту)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню