левое соединение выводит неверный первый блок данных

Я пытаюсь получить данные из двух таблиц: users а также posts с помощью left join,

$items = '';
$sql = "SELECT u.id as uid
, u.name as uname
, p.id as pid
, p.date as pdate
, p.title as ptitle
, p.user as puser
FROM users u
LEFT
JOIN posts p
ON u.id = p.user
WHERE u.role = 'mod'
GROUP
BY p.title;";

$stmt = $db->query($sql);
while($row = $stmt->fetch()){
$date = strtotime($row['pdate']);
$date = date("d-m-Y", $date);
$items.= "<div class='itemp' data-id=" . $row['pid'] . " data-user='" . $row['uname'] . "'>" .
"<span class='spandate'>" . $date . "</span>" .
"<span class='spantitle'>" . $row['ptitle'] . "</span>" .
"<span class='spanuser'>" . $row['uname'] . "</span>" .
"</div>\n";
}
echo $items;

Вывод в порядке, кроме первой строки, где я вижу дату — 1.1.1970 — но в ней нет ни одной строки posts с этой датой. Плюс — в одном ряду ptitle пропал, отсутствует.

Кроме того, есть ли лучший способ создать этот запрос, избегая as ключевое слово?

желаемый выход (один блок):

<div class='itemp' data-id=116 data-user='JOHN SMITH'><span class='spandate'>01-12-2017</span><span class='spantitle'>BLUE SKY</span><span class='spanuser'>JOHN SMITH</span></div>

-2

Решение

Кроме того, есть ли лучший способ создать этот запрос, избегая в качестве ключевого слова?

Да (но не лучше на мой взгляд)

SELECT users.id,
users.name,
posts.id,
posts.date,
posts.title,
posts.user
FROM users
LEFT
JOIN posts
ON users.id = posts.user
WHERE users.role = 'mod'
GROUP
BY posts.title;

Но, как упоминалось в комментариях, в этом случае вы должны изменить цикл while, чтобы получить доступ к вашим значениям. Но я думаю, что это не лучший способ написания этого запроса, потому что это затрудняет чтение.

Относительно вашего JOIN проблема. это зависит от того, каким должен быть ваш результат (я думаю, вы хотите только users с posts ). Так что вы должны взглянуть на INNER JOIN вместо LEFT JOIN, Вы получите только результаты, которые также имеют posts entrys.
Из-за характера LEFT JOIN все записи на левой таблице (в вашем случае users), даже если они не имеют записи в posts Таблица.
INNER JOIN будет возвращать только те результаты, которые соответствуют результатам в обеих таблицах.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector