Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

mysql - Áp dụng một phép nối ngoài cho một câu lệnh phức tạp

Tôi chỉ có thể nghĩ ra một cách để đạt được điều này. Với sự kết hợp của GROUP_CONCATSUBSTRING_INDEX trên truy vấn làm việc hiện tại của bạn. Truy vấn mẫu bên dưới:

SELECT    person_id,
          SUBSTRING_INDEX(GROUP_CONCAT(a.name ORDER BY a.score DESC),',',1) sname, 
          SUBSTRING_INDEX(GROUP_CONCAT(a.score ORDER BY a.score DESC),',',1) max_score FROM 
(SELECT   people.person_id,
          names.name,
          CASE 
          WHEN people.person_default_name_id=names.name_id AND language_scripts.script_id = '1' THEN 3
          WHEN names.language_id = '1' THEN 2
          WHEN language_scripts.script_id = '1' THEN 1
          ELSE 0
          END AS score
FROM      `people` 
LEFT JOIN `names` ON names.person_id=people.person_id
LEFT JOIN `languages` ON names.language_id = languages.language_id
LEFT JOIN `language_scripts` ON languages.language_id = language_scripts.language_id) a 
GROUP BY person_id;

Tôi cũng đã kiểm tra truy vấn trong fiddle http://sqlfiddle.com/#!9 / 54ce8/33

Giải thích một chút:

  1. GROUP_CONCAT qua tên và điểm số với việc bổ sung ORDER BY điều kiện - lưu ý rằng ORDER BY phải giống nhau trong cả hai GROUP_CONCAT .
  2. SUBSTRING_INDEX để nhận giá trị đầu tiên được phân tách bằng dấu phẩy (,) trong trường.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL tìm tất cả các hàng trong đó hàng thứ hai có các giá trị đã cho

  2. Tạo ID dài duy nhất cho một chế độ xem trong MySql

  3. PHP / MySQL - BEGIN ... CAM KẾT Không hoạt động

  4. Làm thế nào để đếm cùng một trường hai lần dựa trên một boolean?

  5. Thiết kế DB:một DB lớn cho tất cả khách hàng hoặc nhiều DB nhỏ