Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL MIN/MAX връща правилната стойност, но не и информацията за свързания запис

Вие станахте жертва на хлабавите правила на MySQL, които позволяват включването на неагрегирани елементи в заявка GROUP BY. Разбира се, работите с MIN или MAX и само ONE наведнъж, но помислете за тази заявка:

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

Сега помислете за кой ред колоната за състояние трябва да идва от. Абсурдно е да се поставя корелация между обобщените (тези в GROUP BY) и неагрегираните колони.

Вместо това напишете заявката си така

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

Но ако сте имали два записа с един и същ created_timestamp, става още по-трудно

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. Изберете Случаен запис и Актуализиране на същия запис в една заявка?

  2. Mysql как да връща редове, дори ако данните за присъединяване са празни

  3. PATINDEX() замяна в MYSQL

  4. Миграции на живо с помощта на MySQL репликация

  5. MySQL заявка в Laravel Eloquent