2015-10-02 41 views
0

在Mysqli語句中存在LEFT JOIN的問題。我有兩張桌子,一張桌子上有各種各樣的事件。第二個表格包含該事件的所有圖像。使用變量(MYSQLI)複雜左連接

我要得到什麼:我想要得到與圖像計數該事件並上傳該事件的最後一個影像的最後8個事件退貨單。

問題:一個簡單的LEFT JOIN對此很好,但是這很麻煩......有時這些事件有多天。所以將兩個表連接在一起的一件事就是FOLDER字段。但是,如果超過一天,情況也會有所不同。這使得事件對比圖像更加困難。

視覺例如:

表:活動

Title  Folder   Days Added 
------------------------------------------- 
Event1  2015-EventA  1  20151001 
Event2  2015-EventB  2  20150901 
Event3  2015-EventC  3  20150801 

表:圖像

File   Folder    Date 
--------------------------------------- 
imgA1.jpg 2015-EventA  20150930 
imgA2.jpg 2015-EventA  20151001 
imgB1.jpg 2015-EventB-1  20150910 
imgB2.jpg 2015-EventB-2  20150901 
imgC1.jpg 2015-EventC-1  20150910 
imgC2.jpg 2015-EventC-2  20151001 
imgC3.jpg 2015-EventC-2  20150930 
imgC4.jpg 2015-EventC-3  20150927 

結果我要找的(記住它的採摘最後上傳的圖像該事件):

Title  Folder   Days  File   IMGCount  IMGFolder 
------------------------------------------------------------------------ 
Event 1 2015-EventA  1  imgA2.jpg 2   2015-EventA 
Event 2 2015-EventB  2  imgB1.jpg 2   2015-EventB-1 
Event 3 2015-EventC  3  imgC2.jpg 4   2015-EventC-2 

我已經試過:

SELECT t1.*, t2.IMGCount, t2.File, T2.Folder AS IMGFolder 
FROM Events as t1 
LEFT JOIN (select count(File) AS IMGCount, Folder, File 
     FROM Images GROUP BY Folder ORDER BY Date DESC LIMIT 8) 
AS t2 
on t1.Folder LIKE t2.Folder 
OR t1.Folder LIKE t2.Folder || '-1' 
OR t1.Folder LIKE t2.Folder || '-2' 
OR t1.Folder LIKE t2.Folder || '-3' 
OR t1.Folder LIKE t2.Folder || '-4' 
    ORDER BY Added DESC LIMIT 8 

這種近乎作品...但事件表重複所有匹配的第一個事件的信息...所以我得到這有正確的圖像表信息,但重複事件:

Title  Folder   Days  File   IMGCount  IMGFolder 
------------------------------------------------------------------------ 
Event 1 2015-EventA  1  imgA2.jpg 2   2015-EventA 
Event 1 2015-EventA  1  imgB1.jpg 2   2015-EventB-1 
Event 1 2015-EventA  1  imgC2.jpg 4   2015-EventC-2 

我在做什麼錯?

+0

我認爲DATE是字符串? –

+0

是的,對於日期和添加 –

回答

1

真的,你應該可以解決你的數據結構。您需要連接表的正確鍵(例如事件ID)。

但是,你可以做你想做的聚合images得到計數和最大的日期,然後加入回images什麼:

SELECT e.*, t2.IMGCount, t2.File, T2.Folder AS IMGFolder 
FROM Events e JOIN 
    (select count(File) AS IMGCount, 
      substring_index(Folder, '-', 2) as efolder, MAX(date) as maxdate 
     from Images 
     GROUP BY eFolder 
     ORDER BY maxdate DESC 
     LIMIT 8 
    ) i 
    ON i.efolder = e.folder JOIN 
    images ii 
    ON substring_index(ii.Folder, '-', 2) = e.folder and 
     ii.date = i.maxdate; 
+0

我在運行時出現錯誤:#1064 - 您的SQL語法出錯;檢查與您的MySQL服務器版本相對應的手冊,以便在'images ii ON substring_index(ii.Folder,' - ',2)= e.folder和'11行附近使用正確的語法 –

1
  1. 這並不容易。首先選擇給你的圖像總數。
  2. 第二個給你什麼是每個事件的最新日期圖片。
  3. 最後給你什麼是圖像。

Sql Fiddle Demo

SELECT imgC.*, imgFile.`File` 
FROM 
    (
     SELECT E.`Folder`, E.`Title`, E.`Days`, COUNT(I.`File`) as IMGCount 
     FROM Events E 
     JOIN Images I 
     ON E.`Folder` = SUBSTRING(I.`Folder`, 1,11) 
     GROUP BY E.`Folder`, E.`Title`, E.`Days` 
    ) as imgC 
JOIN 
    (
     SELECT E.`Folder`, MAX(`Date`) as `LastDate` 
     FROM Events E 
     JOIN Images I 
     ON E.`Folder` = SUBSTRING(I.`Folder`, 1,11) 
     GROUP BY E.`Folder` 
    ) as imgDate 
ON imgC.`Folder` = imgDate.`Folder` 
JOIN (
     SELECT E.`Folder`, I.`File`, I.`Date` 
     FROM Events E 
     JOIN Images I 
      ON E.`Folder` = SUBSTRING(I.`Folder`, 1,11) 
    ) as imgFile 
ON imgDate.`Folder` = imgFile.`Folder` 
and imgDate.`LastDate` = imgFile.`Date` 
+0

我跑這個代碼,但由於某種原因,它帶來噸和噸和噸的圖像。例如:'文件夾\t事件\t天\t IMGCount \t文件 2009年赫米特\t赫米特瑞安航展 HemetRyan09_B-25J_Mitchell_3909.jpg 2009年赫米特\t赫米特瑞安航展 HemetRyan09_B,25J_Mitchell_4024.jpg 2009-赫米特\t赫米特-瑞恩航展\t HemetRyan09_B-25J_Mitchell_6587.jpg 2009-赫米特\t赫米特-瑞恩航展\t HemetRyan09_C-53D_Skyt rooper_3875.jpg 2009年赫米特\t赫米特瑞安航展 HemetRyan09_Dr_D_Taylorcraft_4207.jpg 2009年赫米特\t赫米特瑞安航展 HemetRyan09_EH-1H_Huey_5215.jpg' –

+0

哎呀,註釋不處理代碼他們做得好嗎? –

+0

是的,你應該把你的評論作爲額外的信息在你的問題或甚至更好的只是更新我的SqlFiddle重新創建架構併發送給我的鏈接。 Btw非常酷的圖片在你的個人資料。獲得jelous :) –