![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить запрос [D5, Access]
TechnoDreamer © (2005-09-30 03:45:00)Есть таблица 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)
А как должен выглядеть запрос, ищущий рецепты в которые должны включать все необходимые ингредиенты.
TechnoDreamer (2005-10-07 03:32:00) [1]2vidiv
Что то мне кажется, что оно будет искать все рецепты где есть хотя бы один из ингредиентов. Хотя я не спец, завтра проверю.
vidiv (2005-10-03 10:09:00) [2]А еще, можно убрать групировку:
SELECT *
FROM `t2`
WHERE `RecID` NOT
IN (
SELECT `RecID`
FROM `t1`
WHERE `IngrID` <> 13 AND `IngrID` <> 16
)
Может тоже быстрее будет
ps: прошу прощения за столько сообщений
vidiv (2005-10-03 10:07:00) [3]Если сделать так, то будет быстрее, за счет того что при выполнении внутреннего запроса будет использоваться индекс поля `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 09:36:00) [4]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 версии =)
TechnoDreamer (2005-10-03 00:39:00) [5]2msguns Ну так подскажи более быстрый метод.
msguns (2005-10-02 19:18:00) [6]Представляю, как он будет тормозить даже при относительно небольших объемах таблиц ;)
TechnoDreamer (2005-10-02 17:45:00) [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
Не знаю насколько всё это быстро и правильно, но всё работает.
TechnoDreamer (2005-10-02 17:40:00) [8]Удалено модератором
Примечание: Модерирование не обсуждаем
Что то на самодурство сильно смахивает, хороший ответ с примерами, удалили. Лучше бы реальный бред удаляли, коего полно здесь.
TechnoDreamer (2005-10-01 02:34:00) [9]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"
Где ошибка?
ЮЮ (2005-09-30 09:26:00) [10]Сорри, в 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:00) [11]Ой, а я что-то не разглядел сначала Аксес.
А MINUS там поддерживается в select-е?
ЮЮ (2005-09-30 09:23:00) [12]Удалено модератором
Примечание: Модерирование не обсуждаем
Sergey13 (2005-09-30 09:11:00) [13]БД какая?