у текста может быть 0-2 авторов, LEFT JOIN

movies

Новичок
у текста может быть 0-2 авторов, LEFT JOIN

Есть статьи. Возможны 3 варианта. Либо у статьи нет автора, либо есть, либо их два.

CREATE TABLE bc_texts (
text_id int(11) NOT NULL auto_increment,
text_caption varchar(140) NOT NULL default '',
text text NOT NULL,
author_id tinyint(4) default NULL,
author2_id tinyint(4) default NULL,
PRIMARY KEY (text_id)
);

CREATE TABLE bc_authors (
author_id tinyint(4) NOT NULL auto_increment,
author_name char(36) NOT NULL default '',
PRIMARY KEY (author_id)
);

В случае с одним автором я бы написал

SELECT a.author_name, t.text_caption, t.text
FROM bc_texts as t LEFT JOIN bc_authors as a ON t.author_id=a.author_id
WHERE t.text_id = 5

Не соображу, как следует использовать конструкцию LEFT JOIN для отображения двух авторов?
Подскажите пожалуйста.
 

Demiurg

Guest
SELECT a.author_name, a1.author1_name, t.text_caption, t.text
FROM bc_texts as t LEFT JOIN bc_authors as a ON t.author_id=a.author_id LEFT JOIN bc_authors as a1 ON t.author2_id=a1.author_id
WHERE t.text_id = 5

а вобще лучше использовать связ многие ко многим.
 

movies

Новичок
Спасибо!
Кажется, теперь я наконец понял LEFT JOIN.

а вобще лучше использовать связ многие ко многим
То есть лучше выполнить два запроса, чем работать с подобной "кривоватой" структурой
(к тому же организация новой таблички позволит предусмотреть более двух авторов)
 

movies

Новичок
Можно тогда попросить разобраться, почему один?

Совет по использованию связи "многие ко многим" я понял следующим образом.
Нужно организовать новую табличку

CREATE TABLE texts_authors (
text_id int(11) NOT NULL,
author_id tinyint(4) NOT NULL
);

И тогда следует использовать 2 запроса

SELECT t.text_caption, t.text
FROM bc_texts as t
WHERE t.text_id = 5

SELECT a.author_name
FROM bc_authors as a, texts_authors as ta
WHERE ta.text_id = 5
and a.author_id = ta.author_id

1-й запрос возвращает одну запись, а второй - несколько


Видимо, Вы имели в виду другой способ.
Подскажите пожалуйста! Спасибо
 

chira

Новичок
Код:
SELECT t.text_caption, t.text,a.author_name
FROM bc_texts as t
  LEFT JOIN texts_authors as ta ON ta.text_id = t.text_id
  LEFT JOIN bc_authors as a ON a.author_id = ta.author_id
WHERE t.text_id = 5
 

movies

Новичок
Спасибо

Как я понимаю, результатом такого запроса будет

Код:
+--------------+------+-----------------+
| text_caption | text | author_name |
+--------------+------+-----------------+
|   заголовок  | текст|   автор1        |
+--------------+------+-----------------+
|   заголовок  | текст|   автор2        |
+--------------+------+-----------------+
|   заголовок  | текст|   автор3        |
+--------------+------+-----------------+

А обрабатывать реузультат следует

while ( $row = mysql_fetch_assoc ($result) )
{
$text_caption = $row['text_caption'];
$text = $row['text'];
$author = $row['author_name'];
...
}
то есть для $text_caption и $text происходит "перезапись"


Правильно ли понял последовательность действий?
То что имеет место доблирование присвоения значений переменным $text_caption и $text не страшно?
 
Сверху