MySQL - 多次过滤列

时间:2016-03-06 23:48:30

标签: mysql

我从旧的低采用率的CMS中导出内容。我被卡住了与我的主要资源相关的一些信息。

一个主要表格,"资源,"有书籍等,列有标题,出版年份等。我想创建一个表,每个资源有一个记录,以及新列中其他表的相关信息。

另一个表ResourceNameInts将资源表链接到多种类型的元数据(即作者,语言,格式)。这些只是链接到受控名称表的ID#(" ControlledNames")。资源中的每个标题的每种数据类型也有多个实例。 (例如,多个作者,发布者和格式。)因此,一本书可以在资源表中包含一行,在ResourceNameInts中包含多个关系。现在我只是将它们与GROUP_CONCAT组合在一起;如果我愿意的话,我可以解析那些。

我想创建多个过滤ResourceNameInts的列,但我只能使一列工作(即根据ID#19创建" Publishers"列):

SELECT r1.title, GROUP_CONCAT(c.ControlledName SEPARATOR '; ')
FROM resources r1
RIGHT JOIN resourcenameints r2 ON r1.ResourceId = r2.resourceid
RIGHT JOIN controllednames c ON c.ControlledNameId = r2.ControlledNameId
WHERE c.FieldId=19
GROUP BY r1.title

我想为每种数据类型创建一个列(一个用于ID#19,然后一个用于#s 20,23,24,25和26)。但我只能使用一个WHERE语句。我尝试过为每列使用IF或CASE,例如:

SELECT r1.title,
(CASE c.fieldid WHEN 19 THEN GROUP_CONCAT(c.ControlledName SEPARATOR '; ') END) AS publisher,
(CASE c.fieldid WHEN 20 THEN GROUP_CONCAT(c.ControlledName SEPARATOR '; ') END) AS author
FROM resources r1
RIGHT JOIN resourcenameints r2 ON r1.ResourceId = r2.resourceid
RIGHT JOIN controllednames c ON c.ControlledNameId = r2.ControlledNameId
WHERE c.FieldId=19 OR c.FieldId=20
GROUP BY r1.title

...但我没有得到正确的结果 - "出版商"列已填充,但其他列显示为NULL。我还尝试了一个嵌套的SELECT查询:

SELECT r1.title,
(SELECT GROUP_CONCAT(c.ControlledName SEPARATOR '; ') WHERE c.FieldId=19 GROUP BY r1.title) AS publisher,
(SELECT GROUP_CONCAT(c.ControlledName SEPARATOR '; ') WHERE c.FieldId=20 GROUP BY r1.title) AS creator
FROM resources r1 RIGHT JOIN resourcenameints r2 ON r1.ResourceId = r2.resourceid RIGHT JOIN controllednames c ON c.ControlledNameId = r2.ControlledNameId
GROUP BY r1.title 

但似乎没有正确过滤列。

我是否需要IF或CASE的其他语法,还是有其他我不了解的技术?

0 个答案:

没有答案