Существует некоторая причина, по которой запросы списков настолько сложны: базы данных не предназначены для работы с лимитированными списками. Они оптимизированы для лучшей работы с строками (или наборами) данных. Создание правильной структуры таблицы приведет к значительно лучшей производительности запросов и более простым SQL-запросам. (Так что, хотя это технически возможно, вам следует серьезно подумать о нормализации вашей базы данных, как Тодд и другие.)
Many-to-many отношения лучше всего представлены тремя (3) таблицами. Скажем, вы продаете «виджеты» в разных «размерах».Создайте две таблицы, представляющие основные сущности:
Виджет(уникальных виджетов)
WidgetID | WidgetTitle
1 | Widget 1
2 | Widget 2
....
Размер(уникальные размеры)
SizeID | SizeTitle
7 | X-Small
8 | Small
9 | Medium
10 | Large
11 | X-Large
Затем создать таблицу перехода, для хранения отношений между этими двумя объектами, то есть какие виджеты доступны е, в которых размеры
WidgetSize(доступные размеры для каждого виджета)
WidgetID | SizeID
1 | 7 <== Widget 1 "X-Small"
1 | 8 <== Widget 1 + "Small"
2 | 7 <== Widget 2 + "X-Small"
2 | 9 ....
2 | 10
2 | 11
....
С этой структурой, вы можете легко вернуть все виджеты, имеющие какой-либо (или все) из списка размеров. Не проверено, но что-то похожее на sql ниже должно работать.
Найти виджеты, доступные в любой из размеров: <cfset listOfSizes = "7,9,11">
SELECT w.WidgetID, w.WidgetTitle
FROM Widget w
WHERE EXISTS
( SELECT 1
FROM WidgetSize ws
WHERE ws.WidgetID = w.WidgetID
AND ws.SizeID IN (
<cfqueryparam value="#listOfSizeIds#"
cfsqltype="cf_sql_integer" list="true" >
)
)
Найти виджеты, доступные в все три размера: <cfset listOfSizes = "7,9,11">
SELECT w.WidgetID, w.WidgetTitle, COUNT(*) AS MatchCount
FROM Widget w INNER JOIN WidgetSize ws ON ws.WidgetID = w.WidgetID
WHERE ws.SizeID IN (
<cfqueryparam value="#listOfSizeIds#"
cfsqltype="cf_sql_integer" list="true" >
)
GROUP BY w.WidgetID, w.WidgetTitle
HAVING MatchCount = 3
Вы возможно, захотят рассмотреть возможность разделения этих идентификаторов на отдельную таблицу. Хранение их в качестве значений, разделенных запятыми, станет кошмаром для поддержания. –
Производительность также будет проблемой. Это НЕ, как вы должны хранить данные в базе данных. – datagod
Это также больше подвержено ошибкам. Если вы храните целые числа, результаты всегда будут одинаковыми. Но при сохранении строк поиск «7» не даст того же значения, что и «7.0» или даже «7 (пробел)». +1 для нормализации таблиц. – Leigh