我确信有一种方法可以做到这一点,但由于我还是MySQL和PHP的新手,我无法理解这一点。
我有一个表,第一列(base_folder)表示一个文件夹,该文件夹中有多个图像(sub_folder)。最后一个字段(图层)表示图像顺序。我需要得到的是图层列中base_folder,sub_folder,image_,image_type和视图相同的最大数字。
有没有人知道怎么做?
这是表格:
+-------------------------------------------------------------------------+ | BASE_IMAGE | +-----+-------------+------------+-------------+----------+-------+-------+ | id | base_folder | sub_folder | image |image_type| view | layer | +-----+-------------+------------+-------------+----------+-------+-------+ | 1 | CUP0001 | F | B_FF_0.png | B | FF | 0 | +-----+-------------+------------+-------------+----------+-------+-------+ | 2 | CUP0001 | F | B_FF_0.png | B | FF | 1 | +-----+-------------+------------+-------------+----------+-------+-------+ | 3 | CUP0001 | F | B_FF_0.png | B | FF | 2 | +-----+-------------+------------+-------------+----------+-------+-------+ | 4 | CUP0001 | F | B_FF_0.png | M | FF | 0 | +-----+-------------+------------+-------------+----------+-------+-------+
我想得到的是“2”,其中base_folder ['CUP0001'],sub_folder ['F'],图像['B_FF_0.png'],image_type ['B'],视图['FF '],图层['2']
答案 0 :(得分:3)
原始问题的直接答案是:
SELECT MAX(layer)
FROM Base_Image
WHERE Base_Folder = 'CUP0001'
AND Sub_Folder = 'F'
AND Image = 'B_FF_0.png'
AND Image_Type = 'B'
AND View = 'FF';
如果您需要五个字段的每个组合的最大层,那么您需要GROUP BY子句,您还需要选择标识列:
SELECT Base_Folder, Sub_Folder, Image, Image_Type, View, MAX(layer) AS MaxLayer
FROM Base_Image
GROUP BY Base_Folder, Sub_Folder, Image, Image_Type, View;
(撤回:
看起来很可疑,好像你的桌子没有正确规范化;至少有空间假设Base_Folder,Sub_Folder,Image的组合控制Image_Type和View的值。但是,无论此评论是否准确,所显示的代码都将有效。)
如果长期组合不好,你对更好的方法有什么建议吗?
这取决于数据量以及您将如何管理数据。它还取决于数据的哪些部分是独立的。我很想把桌子分成两张,虽然极端的观点可能会达到五张桌子:
ImageDetails的替代设计避免使用ID列并使用备用密钥作为主键。这部分取决于是否有其他内容将引用此表中的行。
然而,这完全取决于您将要做什么以及数据的组织方式(您显示的表中的功能依赖性)。极端视图将使用:一个表用于基本文件夹;然后会有一个子文件夹表,其中包含一个基本文件夹ID,子文件夹名称就是一个自己的ID字段,然后会有一个图像文件表,其中包含自己的ID,子文件夹ID和图像名称;然后每个图像文件的每个图像类型都有一个图像类型表(具有自己的ID加上FK);等等。这很难插入行;并且需要过滤的每个选择操作,比如基础文件夹和图像类型需要加入很多表。这不一定很慢,但它使SQL变得复杂。
答案 1 :(得分:2)
使用GROUP BY
和MAX
聚合:
SELECT MAX(layer) AS max_layer, base_folder, sub_folder, image, image_type, view
FROM base_image
GROUP BY base_folder, sub_folder, image, image_type, view;
答案 2 :(得分:1)
在SQL语句中尝试这个...
SELECT ........ ORDER BY 'layer' DESC LIMIT 1;
答案 3 :(得分:1)
SELECT
base_folder, sub_folder, image, image_type, view
, MAX(layer)
FROM
BASE_IMAGE
GROUP BY
base_folder, sub_folder, image, image_type, view
ORDER BY
base_folder, sub_folder, image, image_type, view
答案 4 :(得分:0)
SELECT
MAX(layer)
FROM
table
WHERE
image_type = 'B' AND
image = 'B_FF_0.png' AND
view = 'FF' AND
layer = '2' AND
sub_folder = 'F'
答案 5 :(得分:0)
第一种方法可能是使用MAX()
函数和子查询。但是,这不是很有效。
另一个更好的解决方案是滥用ORDER BY
条款,如下所示:
SELECT <your fields>
FROM `BASE_IMAGE`
WHERE <your conditions>
ORDER BY `layer` DESC
LIMIT 1
ORDER BY
子句会导致最大的id
位于顶部,而LIMIT
子句会切断所有其他子句,因此您只能获得最高结果。