Если вы настаиваете на хранение данных, как вы делаете, возможное решение (проверено в T-SQL, вопрос не определяет SQL вкус):
Настройка
create table Recipes
(
RecipeId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Recipes PRIMARY KEY,
Name NVARCHAR(100),
Ingredients NVARCHAR(4000)
)
GO
insert into Recipes (Name, Ingredients) VALUES ('ciorba', 'apa,sare,piper,branza'), ('paste', 'branza,oua,lapte')
GO
create table Ingredients
(
IngredientId INT NOT NULL IDENTITY(1, 1) CONSTRAINT PK_Ingredients PRIMARY KEY,
Name NVARCHAR(100),
Ingredients NVARCHAR(4000)
)
GO
insert into Ingredients (Name, Ingredients) VALUES ('ionutG', 'branza'), ('vasile', 'oua,lapte')
GO
- не помню что является источником для этого - вероятно this
CREATE FUNCTION [dbo].[SplitStrings_XML]
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
select * from Recipes
select * from Ingredients
GO
-- split strings and retrieve records where intersection is not null
select distinct I.Name, I.Ingredients, R.Name
FROM Ingredients I
CROSS APPLY dbo.SplitStrings_XML(Ingredients, ',') IToken
JOIN Recipes R
CROSS APPLY dbo.SplitStrings_XML(Ingredients, ',') RToken
ON RToken.Item = IToken.Item
Примечание:. Как уже упоминалось, вы действительно должны рассмотреть нормализации ваши данные:
1) Производительность - строковые операции являются дорогостоящими и их следует избегать
2) Трудно писать запросы - основной запрос для выяснения общие элементы используют определенную пользователем функцию
3) Плохо для разработки приложений - считают, что клиенту также требуется английская версия приложения. В настоящее время все позиции находятся на румынском языке. Как вам справиться с этой ситуацией?
4) Плохо для отчетов - считайте, что ваша структура требует обширного запроса отчетов об использовании ингредиентов и другой информации.Эти отчеты будут иметь сложные и запутанные вопросы, которые будут медленно
[EDIT] Для MySQL следующих ссылок могут быть использованы для замены неподдерживаемых функций, описанных выше:
Разделить строки, используя метод, показанный here. Связанные вопросы и ответы here и here.
Ваша проблема заключается в том, что вы храните списки элементов в виде строки. Это плохая идея. Исправьте структуру данных, чтобы использовать таблицы соединений, и SQL будет (относительно) легким. –
Я не думаю, что это решение для моей проблемы, потому что один пользователь может иметь так много любимых ингредиентов, что означает один ряд в таблице для каждого понравившегося ингредиента. Возможно, я ошибаюсь, и вы можете дать мне решение, если вы Хорошо. Вы можете использовать таблицы, описанные выше. – Bogdan
Гордон прав. Вы должны прочитать «нормализацию». У вас есть отношения «многие ко многим», которые должны быть смоделированы с помощью таблицы ссылок между рецептами и ингредиентами. Также: какие СУБД вы используете? –