[英]How to get 1 row per user with INNER JOIN
我有兩個表,一個是user
,另一個是images
。 我為用戶提供了選擇多個圖像的選項。 我可以將多個具有相同user_id
圖像存儲在數據庫中,但是當我嘗試從每個用戶那里獲取一個圖像時,便會獲得所有圖像。
我的查詢是這樣的:
$query = "
SELECT *
FROM images i
JOIN users u
ON u.user_id = i.user_id
LIMIT 1";
當我在while()
循環中運行此查詢while()
,我僅從images
表中獲得了第一images
。
如果無法澄清我要問的問題,我真的感到很抱歉。
您是否嘗試過以下方法:
SELECT * FROM users u INNER JOIN images i ON u.user_id = i.user_id GROUP BY u.user_id;
對於每個擁有圖像的用戶,這應該僅從用戶/圖像表中返回一條記錄。
不要在while循環中運行查詢。 而是,使用一個查詢來獲取所有所需的記錄。
如果您堅持循環運行查詢,那么您將缺少WHERE users.user_id = ?
部分,因此您可以在循環中為每個用戶獲得不同的結果。
您可以在不使用聯接的情況下執行此操作。 簡單的選擇用戶並獲取數據,並在“ id”的基礎上添加查詢以獲取圖像。 我希望這能幫到您;
您當前的查詢:
SELECT *
FROM images i
JOIN users u
ON u.user_id = i.user_id
LIMIT 1
使用LIMIT1。這告訴查詢帶回1行。
刪除LIMIT 1將為每位用戶(至少有1張圖片)返回1條或更多記錄,每張圖片一個。
如果您只需要一個用戶,則可以(盡管不建議)使用(ab)使用GROUP BY子句:-
SELECT *
FROM images i
JOIN users u
ON u.user_id = i.user_id
GROUP BY u.user_id
這將為每位用戶帶來一條記錄,但是未定義返回的圖像。 它可以帶回該用戶的第一張圖像,或最后一張,或其他任何圖像(並且返回的圖像將來可能會更改)。 此外,沒有實際原因不能針對圖像表中的每一列從不同行返回值(不太可能,但未指定任何內容可以阻止這種情況發生)。
請注意,基本的SQL標准規定(有一個很小的例外),在SELECT語句中帶回的任何非聚合字段必須位於GROUP BY子句中。 MySQL過去默認情況下不強制執行此限制,但最近已更改,默認情況下已強制執行。 因此,默認情況下,此查詢將不再起作用,因為它僅從GROUP BY子句中的users表中指定user_id,同時返回image和users表中的所有字段。
您應該做的就是為每個用戶定義所需的圖像。 假設第一張圖片(並且圖片表使用稱為id的自動遞增主鍵):
SELECT u.*,
i.*
FROM users u
LEFT OUTER JOIN
(
SELECT user_id
MIN(id) AS first_image_id
FROM images
GROUP BY user_id
) sub0
ON u.user_id = sub0.user_id
LEFT OUTER JOIN images i
ON sub0.user_id = i.user_id AND sub0.first_image_id = i.id
這使用子查詢來獲取每個用戶的第一個圖像ID。 然后將其連接到圖像表,以從圖像表中獲取該圖像的其他詳細信息。
注意我已經使用了LEFT OUTER JOIN。 這是為沒有上載任何圖像的用戶返回一行。
注意,使用SELECT *而不是指定要返回的列通常是一個壞主意。 我將其保留在此處,因為我不知道您的表的列名。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.