Помогите вывести данные из 4х таблиц одним запросом.

gerasim13

Новичок
Помогите вывести данные из 4х таблиц одним запросом.

Подскажите пожалуйста как правильно составить запрос. Есть 4 таблици из которых надо вытянуть данные и сформировать маленький список последних комментариев на сайте.
Вот такие таблици есть:
modx_jot_content - таблица содержит сами комментарии. нужные поля: id, content (текст комментария), uparent (id страницы которая содержит комментарий), createdby (id автора, если комментарий оставил гость то содержит 0 если не 0 то вся строка modx_jot_fields пустая и нужно брать пользователя из modx_user_attributes)
modx_jot_fields - имена гостей. тут такие поля: id (id комментария), content (содержит имя автора или email), label (указывает на то что хранится в content)
modx_site_content - тут нужна 1 ячейка, pagetitle. есть ячейка id которая совпадает с modx_jot_content.uparent.
modx_user_attributes - здесь хранятся данные о зарегистрированных пользователях (ячейка fullname - полное имя пользователя). id совпадает с modx_jot_content.createdby

Вот примерно так выглядит таблица modx_jot_fields:
| id | label | content |
---------------------------------
| 42 | name | Павел |
---------------------------------
| 42 | email | [email protected] |
---------------------------------
| 43 | name | Иван |
--------------------------------
| 43 | email | [email protected] |
--------------------------------

Вот что получилось у меня, но увы работает не правильно.
PHP:
<?php
$guest="modx_jot_fields.label='name' AND modx_jot_fields.id=modx_jot_content.id";
$manager="modx_jot_content.createdby=modx_user_attributes.id";
$whereall ="modx_jot_content.published='1' AND modx_site_content.published='1' AND modx_site_content.id=modx_jot_content.uparent AND (IF (modx_jot_content.createdby=0,($guest),($manager)))";
$sql="SELECT modx_jot_content.content, modx_jot_content.id, modx_jot_content.uparent, modx_jot_content.createdon, modx_site_content.pagetitle,
IF modx_jot_content.createdby=0,modx_jot_fields.content,modx_user_attributes.fullname) AS authname
FROM modx_jot_content, modx_site_content, modx_jot_fields, modx_user_attributes
WHERE $whereall ORDER BY modx_jot_content.createdon DESC LIMIT 3";
$q=mysql_query($sql);
while($row = mysql_fetch_array($q)){
echo '<div class="comment"><div class="ballbtm">';
echo '<div class="content"><a href="'.$row[uparent].'" class="midtxt">'.$row[pagetitle].'</a>
<a href="'.$row[uparent].'#'.$row[id].'" class="darkgrey xsmltxt">'.$row[content].'</a></div>';
echo '</div>';
echo '<div class="aboutpost author">'.$row[authname].' </div>';
echo '</div>';
}
?>
Возможно ли решить мою задачу одним запросом?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Посмотреть в самом Джоте как вытаскиваются коменты для статьи и грохнуть условие "только для этой страници" НЭ?
 

gerasim13

Новичок
Спасибо за идею! Я посмотрю. Но мне хотелось сделать все одним запросом, сомневаюсь что в джоте используется 1 запрос для вытягивания комментариев.

-~{}~ 17.03.10 04:29:

Переписал. Получилось вот так:
PHP:
<?php
$jc='modx_jot_content';
$jf='modx_jot_fields';
$sc='modx_site_content';
$ua='modx_user_attributes';
$sql="SELECT $jc.content, $jc.id, $jc.uparent, $jc.createdon, 
(SELECT $jf.content FROM $jf WHERE $jf.label='name' AND $jc.id=$jf.id ORDER BY $jf.id) AS guestname, 
(SELECT $sc.pagetitle FROM $sc WHERE $jc.uparent=$sc.id ORDER BY $sc.id) AS pagetitle, 
(SELECT $ua.fullname FROM $ua WHERE $jc.createdby=$ua.id ORDER BY $ua.id) AS regname 
FROM $jc WHERE $jc.published=1 ORDER BY $jc.createdon DESC LIMIT 3";

$q=mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($q)){

echo '<div class="comment"><div class="ballbtm">';
echo '<div class="content"><a href="'.$row[uparent].'" class="midtxt">'.$row[pagetitle].'</a><br/>
<a href="'.$row[uparent].'#'.$row[id].'" class="darkgrey xsmltxt">'.$row[content].'</a></div>';
echo '</div>';
echo '<div class="aboutpost author">';
if ($row[guestname]==NULL)
{
echo $row[regname];
} else {
echo $row[guestname];
}
echo '</div></div>';
}
?>
Как оптимизировать это даже не представляю, если кто нибудь подскажет буду очень благодарен=)
 

Trike

Новичок
для начала попробуй писать в таком стиле:

PHP:
SELECT jc.content FROM modx_jot_content jc WHERE jc.label='name'
намного читабельнее будет.

по оптимизации: попробуй использовать lJOIN
 
Сверху