Поскольку я читал, что использование запроса в цикле не является хорошей идеей, я ищу способ использовать 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-запрос, который может рассказать мне пользователей и пользователей об общих элементах для каждого столбца? Я хочу знать, сколько элементов пользователь сопоставляет в каждом столбце, а также имена элементов, которые были сопоставлены для каждого столбца. Если это возможно, какие шаги вы предпримете для этого? Благодарю.
Решение называется нормировкой данных. Вам придется
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 (которые я, вероятно, предпочту)