簡體   English   中英

再添加一個表來查詢和計算數據SQL

[英]Add one more table to query and count the data SQL

我嘗試從4個表中選擇數據(最后一個表需要計算數據)

我的MySQL表結構

用戶

id
username

圖片

id
user_id
image

user_follow

id
user_id
follow_id

評論

id
user_id
image_id
text

我有這個SQL查詢:

    $sql = "SELECT u.username as user, i.image as user_image, p.image, p.date
            FROM users u              
            LEFT JOIN user_follow f ON u.id = f.follow_id
            LEFT JOIN images p ON p.user_id = u.id
            LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
            WHERE f.user_id = 3 OR p.user_id = 3       
            ORDER BY p.date DESC";

此行返回用戶當前圖像(最后一張圖像)

 LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)

它返回我和我的朋友的所有圖像

[0] => Array
    (
        [user] => 8888
        [user_image] => second.jpg
        [image] => second.jpg
        [date] => 2012-01-24 14:42:27
    )

[1] => Array
    (
        [user] => 8888
        [user_image] => second.jpg
        [image] => first.jpg
        [date] => 2012-01-24 14:42:27
    )

[2] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => ax46l7v7vugnesk10whk_339.jpg
        [date] => 2012-01-24 01:54:19
    )

[3] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => aaaaaaaa.jpg
        [date] => 2012-01-24 01:49:57
    )

我試着補充一下

 left join commentaries c ON c.user_id = u.id

結果是

[2] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => ax46l7v7vugnesk10whk_339.jpg
        [date] => 2012-01-24 01:54:19
        [id] => 1
    )

[3] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => ax46l7v7vugnesk10whk_339.jpg
        [date] => 2012-01-24 01:54:19
        [id] => 2
    )

[4] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => aaaaaaaa.jpg
        [date] => 2012-01-24 01:49:57
        [id] => 1
    )

[5] => Array
    (
        [user] => 3333
        [user_image] => ax46l7v7vugnesk10whk_339.jpg
        [image] => aaaaaaaa.jpg
        [date] => 2012-01-24 01:49:57
        [id] => 2
    )

如果有注釋,則重復用戶(順便提一下[user] => 3333在示例中有2條評論)

我正在嘗試添加一個表“評論”並計算每個圖片(來自我和我的朋友)有多少評論如果沒有這樣的$ user_id的評論然后返回0

你真的知道如何讓一個混亂的問題。 這里的問題是你不了解你的聯接的后果。

用你的例子。 你有一個表(在這種情況下是用戶),與其他兩個表(圖像和注釋)有一對多的關系。

比如這樣:

         users
        /     \
  images       commentaries

當您嘗試同時將這兩個相關表連接到基表時,效果是產生兩個子表之間的完全外連接的等效項。

這個:

SELECT *
FROM users u
LEFT JOIN images p ON p.user_id = u.id
LEFT JOIN commentaries c ON c.user_id = u.id

與此完全相同:

SELECT *
FROM images p
LEFT JOIN commentaries c ON c.user_id = p.user_id

(就產生的記錄數量而言)

如果其中一個子表與父表具有1對1的關系,那就沒關系,但它們沒有。 由於它們都有多個記錄,因此效果是FULL OUTER JOIN,結果是輸出中產生的記錄數的乘積。 輸出將包含一個或多個記錄,這些記錄等於一個表中匹配記錄的數量乘以另一個表中匹配記錄的數量。 因此,由於每個表中有兩個匹配該user_id的記錄,因此結果集包含四個記錄。

很難理解你問題的最后部分,所以一些澄清會很好。 看起來好像你只想從一張桌子或另一張桌子上算出記錄,雖然坦率地說我不確定哪一張。

以下行非常混亂。

計算每張照片有多少評論

事實上,如果您只想從一個表或另一個表中計算記錄,那么分組將解決您的乘法問題。

$sql = "SELECT u.username as user, i.image as user_image, p.image, p.date, c.commentcount
        FROM users u              
        LEFT JOIN user_follow f ON u.id = f.follow_id
        LEFT JOIN images p ON p.user_id = u.id
        LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
        LEFT JOIN (SELECT x.user_id, COUNT(*) AS commentcount FROM commentaries x GROUP BY x.user_id) c ON c.user_id = u.id
        WHERE f.user_id = 3 OR p.user_id = 3       
        ORDER BY p.date DESC";

正如之前評論的那樣,問題在於它與圖像基本上沒有任何關系。 圖像和評論之間沒有明顯的直接聯系。 通過users表,它們之間只存在多對多的關系。 所以,我很難確定這對你有幫助。

從本質上講,這只會為您提供用戶擁有的評論數量。 它與圖像無關。 您可以使用非常相似的代碼來告訴您用戶擁有多少圖像,但這與注釋無關。

如果你想做什么,確定一個用戶有多少,如果用戶有另一個,那么這將回答這個問題。 您只需在WHERE子句中添加一個測試,以確定用戶是否具有所需的相關記錄。

如果你能澄清你的意圖,我可以提供更多幫助。 否則,我希望這會有所幫助。

您需要使用GROUP BY來計算組中的行數(在您的情況下,每個圖像的注釋)。 這個查詢應該做的伎倆:

SELECT u.username as user, i.image as user_image, p.image, p.date,
            COALESCE ( imgcount.cnt, 0 ) as comments
            FROM users u              
            LEFT JOIN user_follow f ON u.id = f.follow_id
            LEFT JOIN images p ON p.user_id = u.id
            LEFT JOIN images i ON i.id = (SELECT b.id FROM images AS b where p.user_id = b.user_id ORDER BY b.id DESC LIMIT 1)
            LEFT JOIN 
            ( SELECT image_id, COUNT(*) as cnt FROM
                 commentaries 
              GROUP BY image_id  ) imgcount
            ON p.id = imgcount.image_id
            WHERE f.user_id = 3 OR p.user_id = 3       
            ORDER BY p.date DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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