Связи LEFT JOIN

$lider

Бывает
Связи LEFT JOIN

Привет.
aphorism (
`id_a`
`text_a`
`autor_a`
`added_a`
`tema1_a`
`tema2_a`
`tema3_a`
`tema4_a`
`rating_a`
`admin_a`
`date_a`
)

users (
`id_u`
`login_u`
`pass_u`
`name_u`
`mail_u`
`guest_u`
`last_in_u`
`activ_u`
`code_u`
)

tema (
`id_t`
`tema_t`
`zag_t`
`title_t`
`desc_t`
`key_t`
`dir_t`
`new_t`
`count_t`
`last_in_t`
)


Не могу написать одним запросом:
PHP:
SELECT `text_a`,`autor_a`,`name_u`,`login_u`,`tema1_a`,`tema2_a`,`tema3_a`,`tema4_a`,`dir_t` from `aphorism`
INNER JOIN `users` ON added_a=users.id_u
INNER JOIN `tema` ON tema1_a=tema.tema_t OR tema2_a=tema.tema_t OR tema3_a=tema.tema_t OR tema4_a=tema.tema_t where `added_a`='1'
 
Запись одна, но заполнены поля `tema1_a`,`tema2_a`,`tema3_a`,`tema4_a` разными значениями. Вот и возвращает 4 записи по связи с `tema`
[SIZE=1]Неправ был древний философ, утверждавший, что разум - это возбужденное сердце. В жизни все наоборот: возбужденное сердце - это полное отсутствие разума.	Неизвестный автор	Сергей	admin	РАЗУМ	ЖИЗНЬ	СЕРДЦЕ	ФИЛОСОФИЯ	life
Неправ был древний философ, утверждавший, что разум - это возбужденное сердце. В жизни все наоборот: возбужденное сердце - это полное отсутствие разума.	Неизвестный автор	Сергей	admin	РАЗУМ	ЖИЗНЬ	СЕРДЦЕ	ФИЛОСОФИЯ	mind
Неправ был древний философ, утверждавший, что разум - это возбужденное сердце. В жизни все наоборот: возбужденное сердце - это полное отсутствие разума.	Неизвестный автор	Сергей	admin	РАЗУМ	ЖИЗНЬ	СЕРДЦЕ	ФИЛОСОФИЯ	hearts
Неправ был древний философ, утверждавший, что разум - это возбужденное сердце. В жизни все наоборот: возбужденное сердце - это полное отсутствие разума.	Неизвестный автор	Сергей	admin	РАЗУМ	ЖИЗНЬ	СЕРДЦЕ	ФИЛОСОФИЯ	philosophy
[/SIZE]

Вообще можно реализовать в один заход?
Или подзапросами??

p.s. понимаю что проблема с OR - вот и спрашиваю...
 

Glazyrin Sergey

Новичок
А так ?
SELECT `text_a`,`autor_a`,`name_u`,`login_u`,`tema1_a`,`tema2_a`,`tema3_a`,`tema4_a`,`dir_t` from `aphorism`
INNER JOIN `users` ON added_a=users.id_u
INNER JOIN `tema` t1 ON tema1_a=t1.tema_t
INNER JOIN `tema` t2 ON tema1_a=t2.tema_t
INNER JOIN `tema` t3 ON tema1_a=t3.tema_t
INNER JOIN `tema` t4 ON tema1_a=t4.tema_t
WHERE
`added_a`='1' AND t1.id_t IS NOT NULL AND t2.id_t IS NOT NULL AND t3.id_t IS NOT NULL AND t4.id_t IS NOT NULL

-~{}~ 30.01.09 18:05:

Если я правильно понял проблему. Тебе надо запись в которой сразу в четырех есть тема ?
 

$lider

Бывает
Мне нужно получить так:
Неправ был древний философ, утверждавший, что разум... Неизвестный автор Сергей admin РАЗУМ mind ЖИЗНЬ life СЕРДЦЕ hearts ФИЛОСОФИЯ philosophy

И получить ОДНУ запись...
 

$lider

Бывает
SELECT DISTINCTROW `text_a`,`autor_a`...
возвращает несколько записей.

если Я правильно понял...
 

x-yuri

Новичок
$lider во-первых для связи таблиц используй числовой первичный ключ, а во-вторых зачем ты join'ишь таблицы и добавляешь dir_t, если хочешь одну запись?
 

$lider

Бывает
Не, гадать не будем...
Не выходит с DISTINCTROW...

-~{}~ 30.01.09 17:34:

to x-yuri: да, мне нужна одна запись, но как дописать к `tema1_a`,`tema2_a`,`tema3_a`,`tema4_a` соответственно по таблице `tema` (РАЗУМ mind ЖИЗНЬ life СЕРДЦЕ hearts ФИЛОСОФИЯ philosophy)?

p.s. слова на русском записаны в `aphorism` в поля `tema1_a`,`tema2_a`... соответственно. А анг. нужно вытянуть по асоциации с табл. `tema`
 

x-yuri

Новичок
$lider а что первый вариант Glazyrin Sergey одну запись не выдает?
 

$lider

Бывает
C DISTINCTROW выдает четыре раза (но одну запись) и отличаются они лишь значениями в `dir_t`
 
Сверху