3

「値」という名前の 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')
  • VALUESmysql の予約済みキーワードです。前後にバッククォートを使用します

編集:

あなたはそのようなテーブルを持っている必要があります

 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
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

あなたが達成したいことは正確には明らかではありません。「duration」と「20s」または「extensions」と「mkv」のすべての結果が必要だと思います。したがって、「AND」を「OR」に置き換えるか、中間にする必要があります。

SELECT file FROM values WHERE (metadata='duration' AND value='20s') OR (metadata='extension' AND value='mkv')
于 2013-04-25T09:23:20.657 に答える
0

2番目の条件に存在する使用:

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 に答える