【发布时间】:2015-06-25 15:36:22
【问题描述】:
我正在处理文件/图像数据库。 我有一张表,可以索引文件名并将它们附加到“专辑”
FILES TABLE
file_id | file_name | album_id
1 | image x | 2
2 | image y | 2
第二个表存储文件的位置和各种大小
SOURCE TABLE
source_id | file_id | source_size | source_url
1 | 1 | original | //...
2 | 1 | thumbnail | //...
3 | 2 | original | //...
4 | 3 | original | //...
目前,“source_size”列被列为文本(原始、缩略图、预览等)。
我正在努力查询具有 source_size 首选项的表,同时仍返回该专辑中的所有文件。
到目前为止,它看起来像这样:
SELECT
f.*, s.*
FROM source s
INNER JOIN files f ON f.file_id=s.file_id
WHERE f.album_id="2"
GROUP BY s.file_id
ORDER BY FIND_IN_SET(s.source_size,"thumbnail, original") DESC
我希望它首先以缩略图格式返回文件的 source_id,但如果失败,则只返回未找到匹配项的原始大小文件。
在未来的查询中,可能会优先选择原件或预览版。
【问题讨论】:
-
所以你想要所有文件,不管它们是缩略图还是原始文件,但你想先按缩略图排序?
-
是的,如果有缩略图 - 显示,如果没有缩略图但有预览显示,最后如果没有预览,则显示原始文件。
-
假设他们不会有多个缩略图或原件并且没有其他类型....
select f.*, coalesce(s_thumb.source_url, s_orig.source_url) as source_url from files f left outer join source s_thumb on s_thumb.file_id = f.file_id and s_thumb.source_size='thumbnail' left outer join source s_orig on s_orig.file_id = f.file_id and s_orig.source_size='original' -
不过,这不是理想的方法。 bc 可扩展性。我会look into how mysql does ranking 并使用 case 语句来设置您的源大小首选项,然后按 file_id 为每个组占据首位。
标签: php mysql left-join find-in-set