Опять MySQL - всегда ли можно обойтись без сложного запроса?

ermsoft

Слышал от кого-то, что да.
(На сервере старая версия MySQL.)
Конкректно, есть следующая задача: выбрать поля из table1, имеющие свойства из заданного множества, используя таблицу свойств table2 вида {id, prop_id}.
Сейчас это делается так:
 SELECT * FROM table1 WHERE (SELECT COUNT(*) FROM table2 WHERE prop_id IN (множество необходимых свойств) AND id=table2.id)=1; 

Можно это переписать, чтобы работало без сложных запросов?

vlfdimir58

SELECT * FROM table1, table2 WHERE table2.prop_id IN (множество необходимых свойств) AND table1.id=table2.id;
Только там подходило только когда COUNT(*) равнялся единице, а здесь все возможные...
Это я так, просто мысли изложил. Ща тебе отцы насоветуют..

ermsoft

Ага, так не выйдет, каждая строчка будет дублироваться N раз.
(где N - это COUNT(*) FROM table2 WHERE id=(id этой строки.

Unna

SELECT DISTINCT t1.*
FROM table1 AS t1 JOIN table2 AS t2 ON
(t1.id=t2.id AND t2.prop_id IN (множество необходимых свойств
?

ermsoft

Я только смутно помню, как работает JOIN, но - это опять "типичное не то".
Потому что это выборка по принципу "или", то есть всех строк, которые имеют хоть одно свойство из списка.

Unna

JOIN - это лишь стандарт SQL92
всех ? - ты не прав - посмотри, что значит DISTINCT

ermsoft

Я знаю, что значит DISTINCT
И когда писал свой запрос, помнил, что такое JOIN, и помню, что с ним у меня ничего не вышло, поэтому и остановился тогда на сложном варианте.
Убедись сам:
 
mysql> select distinct t1.id from tour_rec as t1 join tour_rpmm as t2 on (t1.id=
-> t2.id and t2.recprop_id in (26,27;
+------+
| id |
+------+
| 9 |
| 578 |
| 25 |
| 1129 |
+------+
4 rows in set (0.02 sec)
mysql> select * from tour_rpmm where recprop_id=26
-> ;
+------+------------+
| id | recprop_id |
+------+------------+
| 9 | 26 |
| 578 | 26 |
+------+------------+
2 rows in set (0.01 sec)
mysql> select * from tour_rpmm where recprop_id=27;
+------+------------+
| id | recprop_id |
+------+------------+
| 25 | 27 |
| 9 | 27 |
| 578 | 27 |
| 1129 | 27 |
+------+------------+
4 rows in set (0.00 sec)

Unna

тогда я не понимаю что-ты хочешь сделать
а что должно в данном случае получиться (в твоем примере)?

ermsoft

Пересечение.
Блин, понял, я ступил в первом посте.
Конечно, внутренний SELECT должен равняться числу свойств, и в выборке каждая строка должна обладать всеми свойствами, а не любым.
То есть нужно следующее:

+------+
| id |
+------+
| 9 |
| 578 |
+------+
2 rows in set (0.02 sec)

Unna

тогда без сложного никак
Оставить комментарий
Имя или ник:
Комментарий: