Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.30;
Скачать: CL | DM;

Вниз

Помогите составить запрос   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.038 c
14-1128676399
data
2005-10-07 13:13
2005.10.30
Кто может посоветывать хорошую книгу по работе с Red Hat 9?


2-1128514304
NightLord
2005-10-05 16:11
2005.10.30
Принтер


4-1125079468
ctranik
2005-08-26 22:04
2005.10.30
как узнать имя компании создавшей фаил


3-1127359637
V-A-V
2005-09-22 07:27
2005.10.30
Пароль на MDB


14-1128791853
OSokin
2005-10-08 21:17
2005.10.30
Что вы думаете по поводу недавнего заявления Буша?