1

システムにアップロードされたファイルの「ファイルタグ」を表示するページがあります。すべてのファイルには、0、1、またはそれ以上のファイルタグを関連付けることができます。

次のようなファイル名とそのタグを表示するページを正常に作成しました。

File     Tag(s)
File#1   None
File#2   TAG1
File#3   TAG1, TAG2

このSQLクエリは、上記のデータを生成するのに役立ちます。

SELECT *, GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ') 
  AS `x_file_tag_names` 
FROM `file` LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id` 
LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag` 
GROUP BY `fileftg_file` ORDER BY `file_created` DESC;

問題:

ページの上部にフィルターを実装しました。システム内の異なるファイルタグから選択できるようにするフィルター。誰かがフィルターを選択すると、WHERE句に条件を追加します。このクエリを見てください:

 SELECT *, GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ') 
   AS `x_file_tag_names` FROM `file` 
 LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id` 
 LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag` 
 WHERE `fileftg_filetag` = '1' 
 GROUP BY `fileftg_file` ORDER BY `file_created` DESC;

これにより、私のページに次の結果が表示されます。

File     Tag(s)
File#1   None
File#2   TAG1
File#3   TAG1

ここでの問題は、私がまだそれをリストしたいということTAG1, TAG2ですFile#3。しかしもちろん、WHERE条件は。を取り除きTAG2ます。SELECT条件を変更するだけの解決策があるのではないかと思います。私は次のようなソリューションを作成しようとしていました:

SELECT *, IF(ISNULL(`filetag_file`), 'None', 
  (//a subquery that gets all file tags associated with file in outer query))
4

4 に答える 4

1

もう1つ(SQL Fiddle):

select file,
       group_concat(ftg_name order by ftg_name separator ', ') as tag_names
from file
left join link_file_filetag on fileftg_file = file_id
left join filetag on ftg_id = fileftg_filetag
where exists (select *
              from link_file_filetag 
              where fileftg_filetag = 1
                    and fileftg_file = file_id)
group by fileftg_file
order by file_created desc;

結果:

FILE   TAG_NAMES  
File#2 TAG1  
File#3 TAG1, TAG2  
于 2012-11-09T17:53:50.953 に答える
0

これにより、selectステートメントの一部としてgroup_concatを実行できます。結合でテーブルプレフィックスを使用しなかったため、どのテーブルにどのフィールドが含まれているかを推測しています。

SELECT  *, 
        (SELECT GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ') 
  AS `x_file_tag_names` 
         FROM `file` LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id` 
                     LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag`
         WHERE file_id = f.file_id
         GROUP BY `fileftg_file` ORDER BY `file_created` DESC) AS tags

FROM    `file` f
        LEFT JOIN `link_file_filetag` lff ON lff.`fileftg_file` = f.`file_id` 
        LEFT JOIN `filetag` ON ft.`ftg_id` = lff.`fileftg_filetag` 

WHERE   `fileftg_filetag` = '1'
于 2012-11-09T17:48:43.643 に答える
0

すべての答えで申し訳ありませんが、考えてみると、これが一番好きかもしれません。このようにして、適切なタグを持つグループが表示されます。したがって、サブクエリは必要ありません。

 SELECT *, GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ') 
   AS `x_file_tag_names` FROM `file` 
 LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id` 
 LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag` 
 GROUP BY `fileftg_file` 
 HAVING  SUM(CASE WHEN `fileftg_filetag` = '1' THEN 1 ELSE 0 END) > 0
 ORDER BY `file_created` DESC;
于 2012-11-09T18:13:25.530 に答える
0

あなたはこれを行うことができます。これは、「ファイル」テーブルに「ファイル」というフィールドがあることを前提としています。

SELECT  *, 
        GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ') AS `x_file_tag_names` 

FROM    `file` 
        LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id` 
        LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag` 

WHERE file.file_id in (SELECT file_id 
                       FROM   `file` 
                              LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id` 
                              LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag` 
                       WHERE `fileftg_filetag` = '1') 

GROUP BY fileftg_fileORDER BY file_createdDESC;

于 2012-11-09T17:33:28.287 に答える