我以为这将是一个简单的查询,但是我显然在查询逻辑方面存在问题,无法根据需要输出数据。
我想查询两个具有相关表键的表,并从table1输出结果(一行/记录输出),然后从table2输出结果(多行/记录输出)。>
我尝试了UNIQUE,DISTINCT和子查询无济于事。
这是表格信息。和字段:
tblfilm:
filmID(主键)
电影
film1(记录)
tblfilmimage:
imageID
filmID(外键,即tblfilm的主键)
图片
image1(记录)
image2(记录)
这是我尝试过的最新SELECT语句:
SELECT film, image FROM tblfilm, tblfilmimage
WHERE tblfilm.filmID = 2
filmID = 2对于tblfilm中的一部电影是唯一的,并且= tblfilmimages中的多个图像是唯一的,这些图像显示了该电影中的演员。因此,总体目标是能够为一部电影输出多个图像。
当前不希望的输出:
film1 image1
film1 image2
*我正试图消除第二个film1记录的输出。
所需的输出:
film1 image1 image2
查询多个表时,我是使用mysql的新手。而且我敢肯定有一个简单的解决方案,但是我似乎无法完全理解逻辑。因此,任何意见或建议表示赞赏。谢谢。
更新:我现在意识到我原来的问题逻辑存在缺陷……而且我的例子不太清楚。回答者给出的解决方案对我最初写的是正确的。谢谢。我将尝试澄清我要完成的工作。
TableA包含许多电影的列表(示例):
绿野仙踪
乱世佳人...等
TableB具有图像列表(示例):
《绿野仙踪》 Image1
绿野仙踪Image2的向导
绿野仙踪Image3的向导...等。
乱世佳人1
乱世佳人Image2 ...等
查询的期望输出为:
绿野仙踪
《绿野仙踪》 Image1
绿野仙踪Image2的向导
绿野仙踪Image3
乱世佳人
乱世佳人1
乱世佳人2
...等等,包括数百部电影和数百幅图像。
我最初的问题的解决方案向我展示了如何在输出中防止电影名称记录的多个实例,但是需要知道和编码与电影相关的每个图像的ImageID。每部电影都有至少一个要关联的图像。大多数电影都有许多与电影相关的图像。但是与每部电影相关的图像对于一部电影都是唯一的。因此,我需要一种方法来遍历每部影片,通过(filmID)查找与每部影片关联的所有图像,这是每个表格的共同字段(TableA-影片和TableB-图像)。我想我将需要一个变量来存储每个独特的影片,并需要一种将影片变量与一个变量关联的方式,该变量存储与影片具有相同filmID的所有不同图像。我将继续尝试找出解决方法,但如果有人想指出正确的方向,我将不胜感激。谢谢。
答案 0 :(得分:1)
在查询中按公用列correlated subqueries
使用filmID
来产生新列:
SELECT film,
(SELECT image FROM tblfilmimage WHERE imageID=1 and filmID = f.filmID ) as image1,
(SELECT image FROM tblfilmimage WHERE imageID=2 and filmID = f.filmID ) as image2
FROM tblfilm f
WHERE f.filmID = 2;
或者直接使用conditional aggregation
作为更好的选择:
SELECT film,
MAX(CASE WHEN i.imageID=1 THEN i.image END ) as image1,
MAX(CASE WHEN i.imageID=2 THEN i.image END ) as image2
FROM tblfilm f
JOIN tblfilmimage i on i.filmID = f.filmID
WHERE f.filmID = 2
GROUP BY film;
ImageID列的值仅由我推定。
在您的情况下,您使用逗号分隔的表创建了CROSS JOIN
。因此,生成了多行而没有相关性。不建议使用此样式,对于SQL Select语句,此样式被视为旧语法。每当需要JOIN时,都喜欢使用这种称为ANSI-92
标准的JOIN语法,它更易于阅读,理解和维护。