Запрос

zEitEr

Новичок
Запрос

Иммеем две таблицы....
t1
| id | title |
| 1 | title1 |
| 2 | title2 |
| 3 | title3 |
| 4 | title4 |
....

t2
| catid | name | value
| 1 | name1 | 0
| 1 | name2 | 0
| 1 | name3 | 0
| 2 | name4 | 1
| 2 | name5 | 1
| 3 | name6 | 0
| 3 | name7 | 1
....

Делаем запрос.....
PHP:
SELECT p1. * , p2.catid, p3.catid
FROM t1 AS p1, t2 AS p2, t2 AS p3
WHERE p1.id = p2.catid AND p2.value =0 AND p3.value <> 1
GROUP BY p1.id LIMIT 0 , 30
Т.е. выберяем из первой таблицы только те названия (TITLE), которым во второй таблице соответсвуют значения (VALUE) 0...

А получаем.....
id title catid catid
1 | title1 | 1 | 1
3 | title3 | 3 | 1

3 - Тройки не должно там быть! Я что-то не так делаю?
 

Bocha

Guest
а можно узнать в чем смысл такой конструкции t2 AS p2, t2 AS p3
и потом ты накладываешь на одно и тоже поле два условия неравнозначных. Ты же понимаешь, что СТРОГОЕ РАВЕНСТВО 0 и НЕРАВЕНСТВО 1 возвращают разные результаты. Причем первое является подмножеством второго. Зачем тогда второе условие (p3.value <> 1)?
 

zEitEr

Новичок
Делалось все со вложенными селектами... но у мой версии MySQL они не поддерживаются... изначально все выглядело так:

PHP:
SELECT * FROM t1 WHERE id IN (SELECT catid FROM t2 WHERE value = 0 ) AND id NOT IN  (SELECT catid FROM t2 WHERE value = 1 );
Почему 3 не подходит? Да потому что во второй таблице ее дочернему элементу соответсвуют не только 0, а есть и 1!
 

Bocha

Guest
1. а что это за версия такая?
2. ты мне логику объснить можешь. Смотрю на твой запрос и никак не могу понять чего ты хочешь добиться. Сейчас у тебя записано следующее "t2.value должно быть равно нулю И не должно быть равно единице". Но если t2.value равно нулю, то оно НИКОГДА не будет равно единице. Зачем тебе второе условие?
3. Тройка у тебя выскакивает из этой строки
t2
| catid | name | value
..........
| 3 | name6 | 0
......

потому, что эта строка удовлетворяет как t2.value = 0, так и t2.value<>1
 

zEitEr

Новичок
Смотри..... есть категория... с заголовком TITLE.... у нее есть дочерние элементы..... если взять 3, то...
это
id = 3
title = title3

Ей принадлежит два дочерних элемента....

| catid | name | value
| 3 | name6 | 0
| 3 | name7 | 1

Верно?! Верно!...

Смотрим... Из первой таблицы нужно выбрать таких родителей... дети которых не имеют value = 1(!)....
А т.к. у дочернего элемента name7 значение value имеет 1.... то он [родитель с id=3] нам не подходит!

Как правильно тогда организовать запрос?
 

Bocha

Guest
какие еще дети и родители. У тебя две связаных таблицы t1 и t2. Связь по полям t1.id <-> t2.catid, причем связь типа one-to-many. Поэтому должен быть подзапрос, который выискивает все t2.catid для которых t2.value <>0, а затем запрос выбирающий все t2.catid, которые неудовлетворяют первому запросу.
SELECT * FROM t1 WHERE t1.id=t2.catid AND t2.catid NOT IN (SELECT catid FROM t2 WHERE value <> 0 )
типа того, если сам не сделал ошибок :)
 

zEitEr

Новичок
Так.... МуСКЛ не поддерживает вложенные селекты....
переписал.... получилось....

PHP:
SELECT *, t2.catid FROM t1, t2 WHERE t1.id=t2.catid AND t2.value <> 1 GROUP BY t1.id;


Все равно тройка появляется....
 

Апельсин

Оранжевое создание
> Все равно тройка появляется....

еще бы она не появлялась если у тебя условием стоит t2.value <> 1
 

Bocha

Guest
1. http://www.mysql.com/doc/en/Subqueries.html - это что по-твоему?

2. переписаный тобою запрос неправильный он будет включать тройку самособой. Если у тебя не получается со вложенными селектами, то создай временную табличку, куда положи результат этого SELECT catid FROM t2 WHERE value <> 0, а затем составь основной запрос
 

zEitEr

Новичок
PHP:
SELECT  * , t2.catid
FROM t1, t2
WHERE t1.id = t2.catid AND t2.value =1
GROUP  BY t1.id
Все равно.... опять и здесь она.....

-~{}~ 05.04.04 15:22:

Автор оригинала: Bocha
1. http://www.mysql.com/doc/en/Subqueries.html - это что по-твоему?
Это я уже читал... раньше... спасибо :)


Автор оригинала: Bocha
... создай временную табличку, куда положи результат этого SELECT catid FROM t2 WHERE value <> 0, а затем составь основной запрос
Хорошая идея нужно попробовать.....
 

Bocha

Guest
ясен день появляется, потому, что при условии t2.value = 1 у тебя срабатывает эта строка

t2
| catid | name | value
..........
| 3 | name7 | 1
......

а при условии t2.value <>1
t2
| catid | name | value
..........
| 3 | name6 | 0
......
вот эта

тебе надо получить список всех t2.catid для которых условие t2.value<>0 верно и затем исключить эти t2.catid из своего основного запроса. Теперь понятно?!!
 

zEitEr

Новичок
Это сразу было понятно.... и хорошо реализуется со вложенными селектами.....


Буду сейчас пробовать временный таблицы.... :)
 

Bocha

Guest
Автор оригинала: zEitEr
Это сразу было понятно.... и хорошо реализуется со вложенными селектами.....


Буду сейчас пробовать временный таблицы.... :)
судя по составляемым тобою запросам это было не совсем тебе понятно
 

chira

Новичок
SELECT * FROM t1 WHERE id IN (SELECT catid FROM t2 WHERE value = 0 ) AND id NOT IN (SELECT catid FROM t2 WHERE value = 1 );
для MySQL:
Код:
SELECT DISTINCT p1. *
FROM t1 AS p1
 INNER JOIN t2 AS p2 ON p1.id = p2.catid AND p2.value =0
 LEFT JOIN t2 AS p3 ON p1.id = p3.catid AND p3.value =1
WHERE p3.catid IS NULL 
GROUP BY p1.id LIMIT 0 , 30
 

zEitEr

Новичок
Вах...я поражен :)
Не знаю, что там.... но это работает!!!!


Круто :) На повал.... супер! Здорово!

Спасибо всем за помощь, спасибо...

вот только бы теперь разобраться что там к чему....
 

zEitEr

Новичок
PHP:
INNER JOIN t2 AS p2 ON p1.id = p2.catid AND p2.value =0
- это исключаем..... ненужные записи...?!


PHP:
LEFT JOIN t2 AS p3 ON p1.id = p3.catid AND p3.value =1
- это включаем нужные записи?
 

chira

Новичок
Автор оригинала: zEitEr
PHP:
INNER JOIN t2 AS p2 ON p1.id = p2.catid AND p2.value =0
- это исключаем..... ненужные записи...?!
берем нужные (IN)

PHP:
LEFT JOIN t2 AS p3 ON p1.id = p3.catid AND p3.value =1
- это включаем нужные записи?
LEFT JOIN t2 AS p3 ON p1.id = p3.catid AND p3.value =1
WHERE p3.catid IS NULL
исключаем не нужные (NOT IN)
 
Сверху