从数据库中选择一个字段具有最大数字值

时间:2011-07-10 16:38:18

标签: php mysql sql aggregate-functions

我确信有一种方法可以做到这一点,但由于我还是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']

6 个答案:

答案 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的值。但是,无论此评论是否准确,所显示的代码都将有效。


  

如果长期组合不好,你对更好的方法有什么建议吗?

这取决于数据量以及您将如何管理数据。它还取决于数据的哪些部分是独立的。我很想把桌子分成两张,虽然极端的观点可能会达到五张桌子:

  • ImageFile 列(ID,Base_Folder,Sub_Folder,Image),主键ID和备用键(唯一约束)在(Base_Folder,Sub_Folder,Image)上。
  • ImageDetails (ID,ImageFileID,Image_Type,视图,图层,主键ID,备用键(ImageFileID,Image_Type,View,Layer)和引用ImageFile.ID的外键ImageFileID。

ImageDetails的替代设计避免使用ID列并使用备用密钥作为主键。这部分取决于是否有其他内容将引用此表中的行。

然而,这完全取决于您将要做什么以及数据的组织方式(您显示的表中的功能依赖性)。极端视图将使用:一个表用于基本文件夹;然后会有一个子文件夹表,其中包含一个基本文件夹ID,子文件夹名称就是一个自己的ID字段,然后会有一个图像文件表,其中包含自己的ID,子文件夹ID和图像名称;然后每个图像文件的每个图像类型都有一个图像类型表(具有自己的ID加上FK);等等。这很难插入行;并且需要过滤的每个选择操作,比如基础文件夹和图像类型需要加入很多表。这不一定很慢,但它使SQL变得复杂。

答案 1 :(得分:2)

使用GROUP BYMAX聚合:

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子句会切断所有其他子句,因此您只能获得最高结果。

相关问题