php mysql объединить 3 таблицы - PullRequest
0 голосов
/ 08 ноября 2011

Я перебираю систему комментариев типа обратной связи на странице пользователей, находя последние 6 сообщений.

Чтобы отобразить сообщение так, как я хочу, мне нужно взять данные из 3 таблиц.

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

Это мой существующий код

$sql_result = mysql_query("SELECT * FROM feedback WHERE user='1' ORDER BY date desc LIMIT 6", $db);
while($rs = mysql_fetch_array($sql_result)) {

   $sql_result2 = mysql_query("SELECT * FROM members WHERE id= '$rs[author]'", $db); 
   $rs2 = mysql_fetch_array($sql_result2);

   if ($rs2[clan] != 0) { 
      $sql_result3 = mysql_query("SELECT * FROM clans WHERE id= '$rs2[clan]' LIMIT 1", $db);
      $rs3 = mysql_fetch_array($sql_result3);

     // write comment

Может кто-нибудь дать мне подсказку?

Ответы [ 2 ]

5 голосов
/ 08 ноября 2011

Это должно сделать это:

select * from feedback 
left join members on feedback.author = members.id 
left join clans on members.clan = clans.id
where feedback.user = 1

соединение слева означает, что если в таблице справа нет подходящей строки, возвращается запись со всеми нулевыми значениями, поэтому вы все равно получаете данные из таблицы слева.

1 голос
/ 09 ноября 2011

Я сам не эксперт в Sql, но тут и там уловил несколько хитростей: -)

Типичное LEFT JOIN, которое работает в Firebird:

select A.*,B.*,C.*
from FEEDBACK A left join MEMBERS B
on A.USER = B.ID left join CLANS C
ON C.ID = A.USER
where A.USER=1

Логика объединения состоит в том, что все строки, которые теперь имеют одинаковое значение, A.USER = B.ID = C.ID теперь будет виден. Буквы A B и C просто используются для простоты. F, M и C будут работать одинаково.

Это левое соединение выберет все и каждый столбец в таблицах. Это сделано с A.*,B.*,C.* Может быть, вы хотите только несколько столбцов в каждой таблице. Это может быть достигнуто путем именования столбцов таким же образом. Пример:

A.USER,A.FIRSTNAME,A.SURNAME,B.COLNAME1,B.COLNAME2,C.COLNAME1,C.COLNAME2

Если вам необходимо указать столбцы позже, запомните префикс A., B. или C. перед фактическим именем столбца, к которому вы обращаетесь.

Удачи и наилучших пожеланий. Мортен, Норвегия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...