Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.034 c
4-1124886802
BFG9k
2005-08-24 16:33
2005.10.30
RAS: как отловить disconnect ?


1-1128930375
Leonid
2005-10-10 11:46
2005.10.30
Проблема с библиотекой qtintf70.dll


1-1128412343
Ищущий
2005-10-04 11:52
2005.10.30
не показываются подсказки


10-1106305905
Death
2005-01-21 14:11
2005.10.30
Таблици Word


2-1128579372
Wolferio
2005-10-06 10:16
2005.10.30
Опраделить запущен ли файл на печать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский