Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
ВнизПомогите составить запрос Найти похожие ветки
← →
TechnoDreamer © (2005-09-30 03:45) [0]Есть таблица t1 (рецепты-ингредиенты) с полями RecID и IngrID
Есть таблица t2 (рецепты) с полем RecID
Структура такая:
таблица один:
RecID || IngrID
=============
1 || 124
1 || 543
1 || 13
2 || 45
2 || 13
3 || 53
Таблица 2
RecID || Другие поля
=================
1 || ...
2 || ...
3 || ...
Нужен запрос, выдающий рецепты в которые входят все ингредиенты из списка.
Например такой запрос выдает рецепты в которых есть хотя бы один из необходимых ингредиентов:select DISTINCT t2.* from t2,t1 where t2.RecID=t1.RecID and t1.IngrID in (13, 45)
А как должен выглядеть запрос, ищущий рецепты в которые должны включать все необходимые ингредиенты.
← →
Sergey13 © (2005-09-30 09:11) [1]БД какая?
← →
ЮЮ © (2005-09-30 09:23) [2]Удалено модератором
Примечание: Модерирование не обсуждаем
← →
ЮЮ © (2005-09-30 09:26) [3]Сорри, в 1 варианте пропустил ON:
select DISTINCT t2.*
from
(SELECT RecID FROM t1 WHERE IngrID = 13) Ing13
JOIN (SELECT RecID FROM t1 WHERE IngrID = 45) Ing45
ON (Ing13.RecID = Ing45.RecID)
JOIN t2 ON Ing13.RecID = t2.RecID
← →
Sergey13 © (2005-09-30 09:26) [4]Ой, а я что-то не разглядел сначала Аксес.
А MINUS там поддерживается в select-е?
← →
TechnoDreamer © (2005-10-01 02:34) [5]select t2.* from t2
JOIN t1 Ingr0 ON (t2.RecID=Ingr0.RecID) AND (Ingr0.IngrID = 3216)
JOIN t1 Ingr1 ON (t2.RecID=Ingr1.RecID) AND (Ingr1.IngrID = 2146)
Выдает:
"Ошибка синтаксиса в предложении FROM"
Где ошибка?
← →
TechnoDreamer © (2005-10-02 17:40) [6]Удалено модератором
Примечание: Модерирование не обсуждаем
Что то на самодурство сильно смахивает, хороший ответ с примерами, удалили. Лучше бы реальный бред удаляли, коего полно здесь.
← →
TechnoDreamer © (2005-10-02 17:45) [7]Если кому интересно сделал так, ввел дополнительную таблицу Que, где хранятся номера необходимых ингредиентов. Сам запрос выглядит так:
select DISTINCT recept.* from
recept,(SELECT DISTINCT *
FROM RecIngr T1
WHERE NOT EXISTS
(SELECT *
FROM Que T2
WHERE NOT EXISTS
(SELECT *
FROM RecIngr T3
WHERE T1.RecipeID=T3.RecipeID
AND T3.IngrID=T2.ID))) tbl2 WHERE tbl2.RecipeID=recept.ID
Не знаю насколько всё это быстро и правильно, но всё работает.
← →
msguns © (2005-10-02 19:18) [8]Представляю, как он будет тормозить даже при относительно небольших объемах таблиц ;)
← →
TechnoDreamer © (2005-10-03 00:39) [9]2msguns Ну так подскажи более быстрый метод.
← →
vidiv © (2005-10-03 09:36) [10]MySQL (MySQL 4.1.6-gamma-nt)
SELECT *
FROM `t2`
WHERE `RecID` NOT
IN (
SELECT `RecID`
FROM `t1`
WHERE `IngrID` NOT
IN ( 13, 14, 15 )
GROUP BY `RecID`
)
Если кеш настрен правильно, то внутренний запрос будет выполнен только один раз.
Сейчас еще подумаю, может чего по проще придумаю.
P.S. Странно что работает, создатели MySQL обещали ввести поддержку подзапросов только в 5 версии =)
← →
vidiv © (2005-10-03 10:07) [11]Если сделать так, то будет быстрее, за счет того что при выполнении внутреннего запроса будет использоваться индекс поля `IngrID`, который я рекомендую создать=)
SELECT *
FROM `t2`
WHERE `RecID` NOT
IN (
SELECT `RecID`
FROM `t1`
WHERE `IngrID` <> 13 AND `IngrID` <> 16
GROUP BY `RecID`
)
ps: в mysql так
← →
vidiv © (2005-10-03 10:09) [12]А еще, можно убрать групировку:
SELECT *
FROM `t2`
WHERE `RecID` NOT
IN (
SELECT `RecID`
FROM `t1`
WHERE `IngrID` <> 13 AND `IngrID` <> 16
)
Может тоже быстрее будет
ps: прошу прощения за столько сообщений
← →
TechnoDreamer © (2005-10-07 03:32) [13]2vidiv
Что то мне кажется, что оно будет искать все рецепты где есть хотя бы один из ингредиентов. Хотя я не спец, завтра проверю.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2005.10.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.059 c