【问题标题】:Mysql JOIN tables with preference and a GROUP BY带有偏好和 GROUP BY 的 Mysql JOIN 表
【发布时间】: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


【解决方案1】:

这似乎暂时有效,但不确定是否正确......

    SELECT 
    f.*, fs*
    FROM files f
    INNER JOIN (SELECT s.* FROM file_source s ORDER BY FIND_IN_SET(s.source_size,"thumbnail, original") DESC) fs ON f.file_id=fs.file_id 
    WHERE f.album_id="2" 
    GROUP BY f.file_id
    ORDER BY f.file_id DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    相关资源
    最近更新 更多