Mysql 带变量的复左连接
Mysqli语句中的左连接有点问题。我有两个表,其中一个表有用于各种事件的单个条目。第二个表包含该事件的所有图像 我想要得到什么:我想要得到最后8个事件的一次返回,其中包含该事件的图像计数以及为该事件上传的最后一个图像 问题:简单的左连接将非常有用,但是这是一个障碍。。。有时,这些活动需要几天的时间。因此,将两个表连接在一起的是文件夹字段。但是,如果时间超过一天,结果也会有所不同。这使得事件与图像的匹配更加困难 可视示例:Mysql 带变量的复左连接,mysql,sql,left-join,Mysql,Sql,Left Join,Mysqli语句中的左连接有点问题。我有两个表,其中一个表有用于各种事件的单个条目。第二个表包含该事件的所有图像 我想要得到什么:我想要得到最后8个事件的一次返回,其中包含该事件的图像计数以及为该事件上传的最后一个图像 问题:简单的左连接将非常有用,但是这是一个障碍。。。有时,这些活动需要几天的时间。因此,将两个表连接在一起的是文件夹字段。但是,如果时间超过一天,结果也会有所不同。这使得事件与图像的匹配更加困难 可视示例: Title Folder Days
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 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 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
我做错了什么
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
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) 但是,您可以通过聚合
图像
来获得计数和最长日期,然后返回到图像
:
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;
我假设DATE是string?是的,对于DATE和AddedI,当我运行此命令时,我得到一个错误:#1064-您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,了解在“子字符串上的图像ii”\u index(ii.Folder,“-”,2)=e.Folder和“在第11行,我运行了此代码,但出于某种原因,它显示了大量图像。”。示例:
folder event days IMGCount File 2009 Hemet Hemet Ryan Airshow 127 HemetRyan09_B-25J_Mitchell_3909.jpg 2009 Hemet Hemet Ryan Airshow 127 HemetRyan09_B-25J_Mitchell_402; 4024.jpg 2009 Hemet Hemet Ryan Airshow 127 Hemet Ryan09_B-25J_Mitchell_6587.jpg 2009 Hemet Ryan Ryan Airshow 127 Hemet C-53D_空中骑兵3875.jpg2009 Hemet Hemet Ryan Airshow 1 27 HemetRyan09_Dr_D_Taylorcraft_4207.jpg 2009 Hemet Hemet Ryan Airshow 1 27 HemetRyan09_EH-1H_Huey_5215.jpg
Yikes,注释不能很好地处理代码,是吗?是的,您应该将您的注释作为附加信息放在您的问题中,或者更好的是更新我的SqlFiddle重新创建模式并将链接发送给我。顺便说一句,你的个人资料上有很酷的图片。杰卢斯:)现在我明白你在说什么了<代码>空中表演现在变得更加疯狂。我不知道摄影师为什么要做db,但是你应该听Gordon说,你应该改进db的设计,让事情在将来变得容易。对不起,你已经出城参加航展了!我最后用了你的答案和戈登的答案来得到我需要的。我怎样才能给你们两个答案呢?