左连接输出错误的第一个数据块

时间:2017-08-16 15:00:15

标签: php mysql

我尝试使用users从两个表中获取数据:postsleft 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>

1 个答案:

答案 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问题。这取决于你的结果应该是什么(我猜你只想usersposts)。因此,您应该查看INNER JOIN而不是LEFT JOIN。您将只获得posts个委托的结果。 由于LEFT JOIN的性质,左表(在您的情况下为users)中的所有委托都将被使用,即使他们在posts表中没有条目也是如此。 INNER JOIN只返回两个表中匹配结果的结果。