带变量的复杂左连接

Complex Left Join with Variables

Mysqli 语句中的 LEFT JOIN 有点问题。我有两个 table,其中一个具有用于各种事件的单个条目。第二个 table 包含该事件的所有图像。

我想得到什么:我想得到一张 return 的最后 8 个事件,其中包含该事件的图像计数和最后上传的图像事件。

问题: 一个简单的 LEFT JOIN 就可以解决这个问题,但是这是一个障碍...有时这些事件需要好几天才能完成。因此,将两个 table 连接在一起的是 FOLDER 字段。但是,如果超过一天,也可能会有所不同。这使得事件与图像的匹配变得更加困难。

视觉示例:

Table:事件

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

Table:图像

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

这几乎有效...但是事件 table 为所有匹配项重复了第一个事件的信息...所以我得到了具有正确图像 table 信息但重复事件的信息:

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

我做错了什么?

  1. 这并不容易。先select给大家一共图片
  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`

真的,你应该修复你的数据结构。您需要连接表的正确键(例如事件 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;