2017-08-16 95 views
-2

我试图从两个表中获取数据:usersposts使用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; 

输出,除了第一行OK,我看到日期 - 1.1.1970 - 但没有在posts任何行与日期。 Plus - 缺少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

1.1.1970是unix时间的默认日期,但不知道为什么它是你的第一行 – RealCheeseLord

+0

你有一个GROUP BY子句,但没有聚合函数。我不确定我们应该怎么做。 – Strawberry

+0

请参阅:[为什么我应该为我认为是非常简单的SQL查询提供一个MCVE?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve - 对于什么似乎对我来说是一个非常简单的SQL查询) – Strawberry

回答

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 entrys的结果。 由于LEFT JOIN的性质,即使他们没有posts表中的条目,左侧表格中的所有代理(在您的案例中为users)都将被使用。 INNER JOIN只会返回符合两个表中结果的结果。

+0

非常感谢。我会用'inner join'尝试。 – bonaca

+0

该查询彻底破坏了GROUP BY子句。 – Strawberry