2017-08-16 94 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