|
Тема
|
как да избягна подзаявка в mysql
|
|
Автор |
gonzales () |
Публикувано | 09.08.02 16:37 |
|
ще поопростя нещата, нека са две таблици:
books sales
-------- --------
bookid ---> bookid
...... date
.........
искам да извадя тези книги, които не са продавани последните Х дни. Със подзаявка бих ко направил така:
SELECT bookid FROM books WHERE bookid NOT IN (SELECT bookid FROM sales WHERE date>'X')
Обаче както знаем MySQL не позволява подобни заявки :-(
ПОМООООООООЩ!!!
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: gonzales]
|
|
Автор |
Draco (Огън и жупел) |
Публикувано | 09.08.02 16:43 |
|
select b.bookid
from books b, sales s
where
b.bookid = s.bookid and
s.date > 'X'
Не зная какво точно искаш да постигнеш, знам, че може би не съм направил правилно заявката, ама... Надявам се сам да се сетиш нататък
Nihil tam munitum quod non expugnari pecuna possit
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: Draco]
|
|
Автор |
gonzales () |
Публикувано | 09.08.02 16:50 |
|
Май не си ме разбрал / не съм се изразил добре. искам да получа тези, които НЕ са продавани последните дни, т.е. обратното на твойта заявка.
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: gonzales]
|
|
Автор |
Draco (Огън и жупел) |
Публикувано | 10.08.02 10:48 |
|
Е добре де .
Нали видя как можеш да получиш тези, които са продавани последните 15 дни... Обърни знака за сравнение и ... voila .
Целта ми беше да ти покажа идеята, не да ти напиша заявката
Nihil tam munitum quod non expugnari pecuna possit
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: gonzales]
|
|
Автор |
salle (Един такъв) |
Публикувано | 10.08.02 15:57 |
|
SELECT bookid FROM books WHERE bookid NOT IN (SELECT bookid FROM sales WHERE date>'X')
==
SELECT books.bookid
FROM books LEFT JOIN sales
ON books.bookid = sales.bookid
WHERE sales.bookid IS NULL
AND date > CURDATE() - INTERVAL 12 DAY;
Това разбира се е малко свободно съчинение на твоята тема - имам предвид N-те дни назад
Също така понеже двете колонки са ти с еднакво име можеш вместо
FROM books LEFT JOIN sales
ON books.bookid = sales.bookid
да използваш
FROM books LEFT JOIN sales
USING (bookid)
Редактирано от salle на 10.08.02 16:04.
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: salle]
|
|
Автор |
gonzales () |
Публикувано | 12.08.02 15:51 |
|
благодаря, аз също си мислех, че трябва така да стане, но понеже случаят е по-сложен и не се получаваше...
значи така заявката работи, но не мога да съставя работещ пример в случая с три таблици:
books(bookid), sales(saleid,date), salesdata(saleid,bookid)
би следвало заявката да е
SELECT b.bookid FROM tblbooks AS b LEFT JOIN tblhroprodetails AS hd USING(bookid) LEFT JOIN tblhroprotokoli AS h USING(hrpid) WHERE h.hrpid IS NULL AND h.hrpdocdate>'2002-08-09' OR h.hrpdocdate IS NULL
^^^^^^^^^^^^^^^^
без тази част резултата винаги е празен, но ми трябваше доста време да се сетя. което обаче не решава проблема, защото така получавам книгите, които ВЪОБЩЕ не са продавани, а не залежалите. Явно в WHERE клаузата трябва хитрина, но н е сесащам ква да бъде
Редактирано от gonzales на 12.08.02 16:11.
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: gonzales]
|
|
Автор |
salle (Един такъв) |
Публикувано | 13.08.02 14:19 |
|
Сложи скоби навсякъде за да усетиш какъв е точно реда на AND и OR във WHERE
Можеш да си докараш адско главоболие докато схванеш как точно работи такава последователност от LEFT JOIN между няколко таблици но пък ако го разбереш можеш да правиш чудеса.
Пол Дюбоа в книгата си дава примери за това как да с ес месят повече правила във ON условието на LEFT JOIN и резултата е наистина зашеметяващ.
Честно казано обаче единственото което мога да ти препоръчам е да си направиш 3 мънички примерни таблички и да добавяш условия едно по едно и да анализираш много внимателно резултата.
| |
Тема
|
Re: как да избягна подзаявка в mysql
[re: salle]
|
|
Автор |
gonzales () |
Публикувано | 15.08.02 18:35 |
|
ми накрая реших задачата с временна таблица и отговора с двете таблици. ма ми се щеше да я избягна.
| |
|
Няма лошо. По-добре да не работи идеално, но да го разбираш напълно отколкото да имаш нещо, което върши работа ама хич не си наясно как аджеба и дали всичко е наред или само случайно ти връща правилни резултати
Е някой ден може и да разбереш временната таблица къде може да се падне като междинен резултат на някой от Join-овете и да минеш без нея ама това може и да почака нали?
| |
|
|
|
|