Я пытаюсь получить данные из двух таблиц: 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>
Кроме того, есть ли лучший способ создать этот запрос, избегая в качестве ключевого слова?
Да (но не лучше на мой взгляд)
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
будет возвращать только те результаты, которые соответствуют результатам в обеих таблицах.
Других решений пока нет …