MySQL, как я могу показать только максимальные / максимальные значения с помощью следующего запроса? - PullRequest
0 голосов
/ 01 марта 2012

У меня есть следующие таблицы:

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        | 
+----------+-----------+------------+------------+

Мне нужно только самое высокое значение, показанное для каждого

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Это должно быть сделано, однако в 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;

Демо здесь .

Также добавлена ​​демоверсия со значениямив F_THINGS исправлено (другой S_ID для линий, которые вы хотите сгруппировать с помощью геля и пластика), чтобы сделать возможную группировку здесь .

1 голос
/ 01 марта 2012

try ...

ЗАКАЗАТЬ ПО УКАЗАНИЮ DESC

как последняя строка вашего запроса

0 голосов
/ 01 марта 2012

Тогда просто поменяйте

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
...