我尝试使用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>
答案 0 :(得分:0)
此外,是否有更好的方法来创建此查询,避免使用关键字?
是的(但在我看来并不是更好):
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
个委托的结果。
由于LEFT JOIN
的性质,左表(在您的情况下为users
)中的所有委托都将被使用,即使他们在posts
表中没有条目也是如此。
INNER JOIN
只返回两个表中匹配结果的结果。