2017-05-25 108 views
0

我做一個簡單的表與文章列表,用戶的另一個表,另一個物品的用戶喜愛:分組MySQL的結果與連接表

文章表:

id, userId, title, article, date 

用戶表

id, name, email, last_login 

喜歡錶:

id, user_id, article_id, dateLiked 

我當前的查詢:

SELECT 
articles.id as aid, articles.userId, articles.title, articles.article, 
likes.user_id as uLiked, likes.article_id as articleLiked 
FROM articles 
LEFT JOIN likes ON articles.id = likes.article_id 
WHERE userId= "10" 

所以,我想獲得一個用戶的所有文章,然後在while循環,我檢查,看看用戶是否在比賽中喜歡簽署該行,並顯示其激活如果是。如果不是,它仍然顯示爲非活動狀態。如果他們正在查看別人的文章,則可以是他們的名字。他們應該看到所有文章,但是他們鏈接的文章應該是活躍的。

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 

    if($row['uLiked'] == 30 && $currentArticleID = $row['articleLiked']){ $status = 'active'; } else { $status = 'inactive'; } 

    echo '<div class="'.$status.'">'.$row['title'].'</div>'; 

} 

問題是,當文章被人喜歡時,帖子會顯示兩次,但兩次都是有效的。我嘗試了分組,但是當分組時,它會像我想要的那樣顯示文章,但沒有任何內容是活動的。

希望我能正確解釋,但我真的被困在這裏。任何想法傢伙?我可能會接近這個錯誤..

+0

編輯您的問題,並提供樣本數據和期望的結果。而且,你寫的查詢不起作用,因爲'WHERE'子句中'user_id'不明確。 –

回答

0

如果你打算使用group by然後mysql將一行中的所有行分組,並且該mysql只會從分組行中選擇第一行,而其他行將被忽略。

所以你已經改變了一些邏輯。

使用GROUP_CONCAT mysql方法。

SELECT 
articles.id as aid, articles.userId, articles.title, articles.article, 
CONCAT(',',GROUP_CONCAT(likes.user_id),',') as uLiked, likes.article_id as articleLiked 
FROM articles 
LEFT JOIN likes ON articles.id = likes.article_id 
WHERE userId= "10" group by {which every you want}; 

之後,你會在uLiked參數得到這樣,10,30,15,userid)數據。

現在你可以通過字符串來確定登錄用戶的strpos方法檢查。

while($row = mysqli_fetch_array($query, MYSQLI_ASSOC)){ 

    if(strpos($row['uLiked'], ',30,') !== false && $currentArticleID = $row['articleLiked']){ $status = 'active'; } else { $status = 'inactive'; } 

    echo '<div class="'.$status.'">'.$row['title'].'</div>'; 

} 
+0

我的男人!這正是我試圖做...我稍微改變了它的只是在做'GROUP_CONCAT(likes.user_id)'查詢,而'如果(strpos($行[「uLiked」],30)!==假){'但正是我所需要的,謝謝! – Keezy

+1

你必須把,(逗號)的起點,並在你的病情,否則130結束也將得到滿足是不對的。 –