Выборка с двух таблиц и оператор OR

ccop

Новичок
Выборка с двух таблиц и оператор OR

Есть запрос, такого типа
[SQL]
SELECT SQL_CALC_FOUND_ROWS u.ua_name AS name, u.ua_surname AS surname, k.ua_kap_name AS kname, r.id, r.author_id, r.description, r.city, r.date, r.type, r.author_type
FROM news AS r, users AS u, kap AS k
WHERE (
(
u.id = r.author_id AND r.type <3
) OR (
k.id = r.author_id AND (
r.type =3 OR r.type =4
)
)
) AND (
r.author_type =2
)
ORDER BY r.date DESC
LIMIT 0 , 20
[/SQL]
Суть заключается в следующем: Нужно из базы news выбрать записи, так, если r.type < 3, то берем информацию о том, кто разместил новость из users
А если r.type > 3 && r.type < 4, то информацию нужно брать с базы kap.

Проблема: если в базе есть записи, которые удовлетворяют условие k.id = r.author_id AND (r.type =3 OR r.type =4), то из таблицы users будут взяты все записи, ибо не налаживается ограничение эту таблицу.

Как решить эту проблему?
Спасибо!
 

alpes

Весь мир на ладони
Через OR так связывать не годится, смотри описание к JOIN
чтото типа этого:
[sql]
SELECT a.name, b.uname, c.kname
FROM a
LEFT JOIN b ON a.author_id = b.id
AND a.type =2
LEFT JOIN c ON a.author_id = c.id
AND a.type =3
WHERE a.author_type =2
GROUP BY a.id[/sql]
Но не уверен насчет оптимальности подобных запросов.

Если таблицы users и kap однородные то имеет смысл их объединить в одну с добавлением поля отличия type
 

ccop

Новичок
Там все поля, по которым делается выборка индексированы... Так что проблем быть не должно.

Спаисбо разобрался!
 

zerkms

TDD infected
Команда форума

.des.

Поставил пиво кому надо ;-)
во многих случаях все что находится после ON ... можно перенести в WHERE ...
отсюда делайте выводы.
 

ccop

Новичок
.des.
В моем случае у WHERE перенести нельзя... Ибо для каждой аблицы разные условия.
 

.des.

Поставил пиво кому надо ;-)
Хм.. :) я вообщем то не такие выводы имел ввиду.
Я вот о чем:
Автор: zerkms
подробнее: примеры запросов после текста: "These WHERE clauses do not use indexes:
Автор:
Так ведь JOIN'ы в тот список не входят
Вы думаете, что при объединении таблиц индексы используются, каким то иным способом, чем в where?
Прочитать, нюансы использования индексов mysql было бы полезно и explain полезно посмотреть..
но дело ваше, Вам и решать.
 

zerkms

TDD infected
Команда форума
чтобы далее не было непоняток - ссылку я дал с намёком на то, что с OR нужно пользоваться аккуратно, а т.к. до сих пор итогового решения не было (как и EXPLAIN) - сказать что либо трудно - остаётся лишь как всегда догадываться ;)
 
Сверху