簡體   English   中英

如何使用INNER JOIN為每個用戶獲取1行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM