3

我有一个名为 'values' 的 mySQL 表:

values:

file | metadata | value
________________________
01   | duration | 50s
01   | size     | 150mo
01   | extension| avi
02   | duration | 20s
02   | extension| mkv
03   | duration | 20s
03   | extension| mpeg

用户将在 SQL 中创建自己的查询,如下所示:

SELECT file FROM values WHERE (metadata='duration' AND value='20s') AND (metadata='extension' AND value='mkv')

我知道这个查询不好,但我无法更改“值”表。我不知道如何在这些条件下获取 file_id ..

有任何想法吗 ?

提前致谢 !

4

5 回答 5

7

像这样:

SELECT file
FROM
(
  SELECT file,
    MAX(CASE WHEN metadata = 'duration' THEN value END) AS duration,
    MAX(CASE WHEN metadata = 'extension' THEN value END) AS extension
  FROM `values`
  WHERE metadata IN ('duration', 'extension') 
  GROUP BY file
) AS sub
WHERE duration = '20s' AND extension = 'mkv';

在这里查看它的实际效果:


更新

如果要动态执行此操作,并假设这些元数据名称存储在新的单独表中,则可以使用动态 sql 执行此操作。像这样的东西:

SET @sql = NULL;
SET @cols = NULL;

SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(m.metadata_name = ''',
      m.metadata_name, ''', v.value, 0)) AS ', '''',   m.metadata_name, '''')
  ) INTO @cols
FROM Metadata AS m;

SET @sql = CONCAT('
  SELECT 
    v.file, ', @cols ,'
  FROM `values` AS v
  INNER JOIN metadata AS m ON v.metadata_id = m.metadata_id
  GROUP BY v.file');

prepare stmt 
FROM @sql;

execute stmt;

更新的 SQL Fiddle 演示

然后你可以把它放在一个存储过程中并用它来显示它们,或者以你想要的方式查询它们。

于 2013-04-25T09:28:12.220 回答
2

尝试这个

SELECT file FROM `values` 
WHERE (metadata='duration'  AND value='20s') 
OR    (metadata='extension' AND value='mkv')
  • VALUES是 mysql 的保留关键字,在它周围使用反引号

编辑:

你应该有这样的桌子

 file | size | duration | extension |
  1   | 150mo|  50s     | avi
  2   | null |  20s     | mkv
  3   | null |  20s     | mpeg

那么你的查询将是

    select file from `values` where duration = '20s' and extension = 'mkv' 

    
于 2013-04-25T09:22:57.960 回答
0

目前尚不清楚您想要实现什么。我猜你想要“持续时间”和“20 秒”或“扩展”和“mkv”的所有结果。所以你应该用“OR”替换或中间的“AND”。

SELECT file FROM values WHERE (metadata='duration' AND value='20s') OR (metadata='extension' AND value='mkv')
于 2013-04-25T09:23:20.657 回答
0
SELECT 
    v.file 
FROM values AS v 
WHERE (v.metadata='duration' AND v.value='20s') 
  OR (v.metadata='extension' AND v.value='mkv')
于 2013-04-25T09:24:30.573 回答
0

使用存在于第二个条件:

SELECT distinct file FROM values WHERE (metadata='duration' AND value='20s') AND
exists (  SELECT * FROM values as v2 where v2.metadata='extension' AND v2.value='mkv' and v2.file=values.file )
于 2013-04-25T09:25:57.447 回答