Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL MIN/MAX zwraca prawidłową wartość, ale nie powiązane informacje o rekordzie

Padłeś ofiarą luźnych reguł MySQL, które pozwalają na uwzględnienie nieagregatów w zapytaniu GROUP BY. Jasne, pracujesz z MIN lub MAX i tylko JEDEN na raz, ale rozważ następujące zapytanie:

SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest,
    MAX(created_timestamp) as latest
  FROM conditions
  GROUP BY condition_id

Zastanów się teraz, który wiersz z której powinna pochodzić kolumna stanu. Absurdem jest umieszczanie korelacji między agregacją (te w grupie GROUP BY) a kolumnami bez agregacji.

Zamiast tego napisz zapytanie w ten sposób

SELECT X.condition_id, C.status, X.earliest
FROM (
  SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest
  FROM conditions
  GROUP BY condition_id
) X JOIN conditions C
  on CONCAT(c.work_type, c.work_id) = X.condition_id
  and c.created_timestamp = X.earliest

Ale jeśli masz dwa rekordy z tym samym created_timestamp, będzie to jeszcze trudniejsze

SELECT X.condition_id, Max(C.status) status, X.earliest
FROM (
  SELECT 
    CONCAT(work_type, work_id) AS condition_id, 
    status,
    MIN(created_timestamp) as earliest
  FROM conditions
  GROUP BY condition_id
) X JOIN conditions C
  on CONCAT(c.work_type, c.work_id) = X.condition_id
  and c.created_timestamp = X.earliest
GROUP BY X.condition_id, X.earliest


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę włączyć rozszerzenie MySQLi w PHP 7?

  2. Laravel:relacja jeden do jednego staje się relacją jeden do wielu

  3. findAll() z Sequelize nie otrzymuje

  4. MySQL :błąd w składni SQL | LIMIT 0, 25

  5. Django - Zmień relację klucza obcego na OneToOne