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

  • Автор темы Автор темы ccop
  • Дата начала Дата начала

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 будут взяты все записи, ибо не налаживается ограничение эту таблицу.

Как решить эту проблему?
Спасибо!
 
Через 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
 
Там все поля, по которым делается выборка индексированы... Так что проблем быть не должно.

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