带变量的复杂左连接
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
我做错了什么?
- 这并不容易。先select给大家一共图片
- 第二个给你每个事件的最新日期图片是什么。
- 最后给你那个图是什么
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;
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
我做错了什么?
- 这并不容易。先select给大家一共图片
- 第二个给你每个事件的最新日期图片是什么。
- 最后给你那个图是什么
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;