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

Hành vi kỳ lạ của nhóm trong Truy vấn cần được tối ưu hóa

Tôi đã xem xét lược đồ và SQL của bạn trong một thời gian và tôi không hiểu logic của bạn. Những điều tôi thấy:

  • bạn có một tập hợp các giao dịch (chính xác là 9);
  • đối với mỗi giao dịch, bạn có thông tin chi tiết về ghi nợ và ghi có;
  • sử dụng account_code ở mỗi bên, bạn có thể nhận được thông tin về tài khoản.

Vì vậy, tôi sẽ đi theo cách này cho người mới bắt đầu và tạo một VIEW , điều đó sẽ cung cấp cho bạn tất cả các thông tin cần thiết cho các giao dịch của bạn. Tôi đã sử dụng INNER tham gia ở đây, vì tôi tin rằng mỗi giao dịch phải có cả hai bên ghi nợ và ghi có, và mỗi bên, lần lượt, phải có một tài khoản:

CREATE VIEW all_transactions AS
SELECT ti.transaction_id tid, ti.voucher_no tvno, ti.voucher_date tvdt,
       ds.account_code dacc, ds.amount damt, da.name daname, da.type dat,
       cs.account_code cacc, cs.amount camt, ca.name caname, ca.type cat
  FROM transaction_info ti
  JOIN debit_side ds ON ds.transaction_id_dr = ti.transaction_id
  JOIN credit_side cs ON cs.transaction_id_cr = ti.transaction_id
  JOIN accounts da ON da.code = ds.account_code
  JOIN accounts ca ON ca.code = cs.account_code;

Bây giờ, khi xem xét các truy vấn của bạn, có vẻ như bạn đang cố gắng lấy danh sách tất cả các thao tác đối chiếu cho từng mã tài khoản. Tôi không chắc mục đích của việc này là gì, nhưng tôi sẽ làm như sau:

  • đã chọn một danh sách các mã tài khoản duy nhất;
  • đã tạo một danh sách tổng hợp các hoạt động bên ghi nợ cho từng mã tài khoản, trong đó mã đó ở bên ghi có;
  • đã tạo cùng một danh sách tổng hợp cho các hoạt động bên ghi có, trong đó tài khoản đó ở bên ghi nợ;
  • và đặt từng mã tài khoản ở giữa.

Vì vậy, một cái gì đó như thế này có thể thực hiện công việc:

SELECT group_concat(dacc) "D-Accounts",
       group_concat(damt) "D-Amounts",
       group_concat(daname) "D-Names",
       group_concat(dvdt) "D-Dates",
       code, name,
       group_concat(cacc) "C-Accounts",
       group_concat(camt) "C-Amounts",
       group_concat(caname) "C-Names",
       group_concat(cvdt) "C-Dates"
  FROM (
    SELECT atl.dacc, atl.damt, atl.daname, atl.tvdt dvdt,
           a.code, a.name, NULL cacc, NULL camt, NULL caname, NULL cvdt
      FROM accounts a
      LEFT JOIN all_transactions atl ON atl.cacc = a.code
    UNION ALL
    SELECT NULL, NULL, NULL, NULL, a.code, a.name,
           atr.cacc, atr.camt, atr.caname, atr.tvdt cvdt
      FROM accounts a
      RIGHT JOIN all_transactions atr ON atr.dacc = a.code
  ) full_join
 GROUP BY code, name
 ORDER BY code;

Ở phần bên trong, tôi đang mô phỏng FULL OUTER tham gia bằng cách hợp nhất 2 liên kết khác, LEFTRIGHT những cái. Và phần bên ngoài thực hiện tất cả các nhóm. Hãy xem kết quả .

Lưu ý rằng nếu bạn muốn thêm / xóa các cột khỏi kết quả, bạn nên sửa đổi cả truy vấn bên trong và bên ngoài.

Tôi hy vọng đây là những gì bạn đang tìm kiếm.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. làm thế nào để viết một tệp json như một nguồn dữ liệu trong php?

  2. Nhiều biểu mẫu và một trang xử lý

  3. Tại sao khóa ngoại không được tạo bằng GORM?

  4. Kiểm tra cú pháp MySQL nếu tham số là null

  5. Chọn phụ hay không chọn phụ?