【问题标题】:MySQL how do I only show the max/highest values with the following query?MySQL 如何仅使用以下查询显示最大值/最大值?
【发布时间】:2012-03-01 16:22:40
【问题描述】:

我有以下表格:

mysql> select * from F_FINDINGS;
+---------+------------+
|   F_ID  | CONFIDENCE |
+---------+------------+
|       1 |        100 | 
|       2 |         70 | 
|       2 |       0.35 | 
|       1 |        100 | 
+---------+------------+

mysql> select * from F_THINGS;
+---------+-------------------+--------+------------+
|   F_ID  |    F_TITLE        |  S_ID  | F_VALUE    |
+---------+-------------------+--------+------------+
|       1 | STUFF A           |      1 |        1.1 |       
|       2 | STUFF C           |      1 |      202.2 | 
|       3 | OBJECT P          |      1 |       10.7 |           
|       4 | Things X          |      2 |        540 |   
|       5 | STUFF D           |      2 |       1080 | 
|       6 | OBJECT M          |      2 |        455 |       
|       7 | Things A          |      3 |        333 |              
|       8 | Things B          |      4 |        825 |         
|       9 | STUFF A           |      1 |      103.4 |          
|      10 | STUFF A           |      1 |       98.4 |
+---------+-------------------+--------+------------+

  mysql> select * from DUMP;
   +--------+----------+
   | D_ID   | D_NAME   |
   +--------+----------+
   |      1 |   E0     | 
   |      2 |   A1     | 
   |      3 |   AB     | 
   +--------+----------+

mysql> select * FROM STUFF;
+--------+--------+-------------------+
|   S_ID |   D_ID |   S_TITLE         |
+--------+--------+-------------------+
|      1 |      1 | plastic           | 
|      2 |      2 | metal             | 
|      3 |      3 | wood              | 
|      4 |      3 | gel               | 
+--------+--------+-------------------+

我正在使用以下查询

SELECT
d.D_NAME,
s.S_TITLE,
f.F_VALUE,
IF(r.CONFIDENCE IS NULL, 'N/A', CONCAT((r.CONFIDENCE),'%')AS CONFIDENCE

FROM F_THINGS f

JOIN STUFF s ON s.S_ID=f.S_ID
JOIN DUMP d on d.D_ID=s.D_ID

LEFT JOIN F_FINDINGS r ON f.F_ID=r.F_ID;

期望的结果:

+----------+-----------+------------+------------+
| D_NAME   | S_TITLE   | F_VALUE    | CONFIDENCE |
+----------+-----------+------------+------------+
| E0       |  plastic  |      202.2 | 70%        |  
| E0       |  plastic  |       10.7 | N/A        |
| E0       |  plastic  |        1.1 | 100%       |  
| A1       |  metal    |        540 | N/A        | 
| A1       |  metal    |       1080 | N/A        | 
| A1       |  metal    |        455 | N/A        | 
| AB       |  wood     |        333 | N/A        | 
| AB       |  wood     |        825 | N/A        | 
| E0       |  gel      |      103.4 | N/A        | 
| E0       |  gel      |       98.4 | N/A        | 
+----------+-----------+------------+------------+

我只想要每个显示的最高值

【问题讨论】:

  • 你的“STUFF”样本数据在哪里......还有,最高价值?还是最高的信心?只是确保
  • @DRapp 我将添加“东西”表。对不起,我把它漏掉了。我想要最高的信心
  • @VAShhh 期望的输出列在最底部,上面写着“期望的结果”
  • 那我不理解你想要的输出。如果你想要最高的信心......最高的每什么...... D_Name,S_Title?您正在显示 3、3、2、2 个条目。例如:您是否只想看到“E0 - 塑料 - 1.1 of 100%”,而其他“E0 - 塑料 - 202.2 at 70%”?
  • @DRapp 如果您查看 F_FINDINGS 表。我只想显示 F_ID 的最高置信度(来自 F_FINDINGS 表)

标签: mysql select inner-join


【解决方案1】:

应该这样做,但是 STUFF 中没有值可以提供您想要的结果('gel' 和 'plastic' 需要相同的 S_ID 和 D_ID,并且在某种程度上仍然不同),这使得结果与你想要的。下次您可能想要添加 STUFF,因此无需对其进行逆向工程;-)

SELECT
d.D_NAME,
s.S_TITLE,
f.F_VALUE,
IF(MAX(r.CONFIDENCE) IS NULL, 'N/A', CONCAT((MAX(r.CONFIDENCE)),'%')) AS CONFIDENCE
FROM F_THINGS f
JOIN STUFF s ON s.S_ID=f.S_ID
JOIN DUMP d on d.D_ID=s.D_ID
LEFT JOIN F_FINDINGS r ON f.F_ID=r.F_ID
GROUP BY D_NAME, S_TITLE, F_VALUE;

演示here.

还添加了一个演示,其中 F_THINGS 中的值已更正(您希望使用凝胶和塑料分组的线的 S_ID 不同)以使您可能需要here 进行分组。

【讨论】:

  • 我可能不完全理解“分组依据”的基本方面,但为什么它只显示最高的? (这毕竟是我所追求的)
  • @Gah_Jamn-it 一个组由具有相同 D_NAME、S_TITLE 和 F_VALUE 的行组成。置信度的 MAX 将显示每组中的最高值。
【解决方案2】:

试试……

按置信度 DESC 排序

作为查询的最后一行

【讨论】:

  • 我只想要每个显示的最高值。 Order by 将显示所有
  • 怎么样:ORDER BY confidence DESC LIMIT 1
  • 也许将它与 group by 子句结合起来
【解决方案3】:

那就换个方式

LEFT JOIN F_FINDINGS r ON f.F_ID=r.F_ID;

LEFT JOIN ( select F_ID, MAX(  CONFIDENCE ) as Confidence
               from F_Findings
               group by F_ID ) as r
   on F.F_ID = r.F_ID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2021-12-10
    • 2018-05-18
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多