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

Nối các bảng với giá trị dấu phẩy

Tôi khuyên bạn nên đặt các phép nối của mình một cách rõ ràng.
Điều này giúp dễ dàng gỡ lỗi truy vấn của bạn và thay đổi bên trong bằng các phép nối bên trái.
Hoàn toàn không có lý do chính đáng để sử dụng cú pháp liên kết ngầm định của SQL '89.

SELECT ni.*
       , nf.*
       , group_concat(nm.mailgroup_name) as mailgroups
FROM newsletter_items ni
INNER JOIN newsletter_fields nf 
  ON (nf.field_letter_uid = ni.letter_id)
INNER JOIN newsletter_mailgroups nm  
  ON (find_in_set(nm.mailgroup_id, ni.receivers))
WHERE  
  nf.field_name = 'letter_headline' 
  ni.template = '". $template ."' 
GROUP BY ni.letter_id;

Về thiết kế cơ sở dữ liệu của bạn.
Tôi khuyên bạn nên bình thường hóa cơ sở dữ liệu của mình, nghĩa là bạn di chuyển các trường được phân tách bằng dấu phẩy sang một bảng khác.

Vì vậy, bạn tạo một bộ thu bảng

Receivers
----------
id integer auto_increment primary key
letter_id integer not null foreign key references newsletter_items(letter_id)
value integer not null

Sau đó, bạn xóa bộ thu trường khỏi bảng newsletter_items

Sau đó truy vấn của bạn thay đổi thành:

SELECT ni.*
       , group_concat(r.value) as receivers
       , nf.*
       , group_concat(nm.mailgroup_name) as mailgroups

FROM newsletter_items ni
INNER JOIN newsletter_fields nf 
  ON (nf.field_letter_uid = ni.letter_id)
INNER JOIN newsletter_mailgroups nm  
  ON (find_in_set(nm.mailgroup_id, ni.receivers))
LEFT JOIN receiver r ON (r.letter_id = ni.letter_id)
WHERE  
  nf.field_name = 'letter_headline' 
  ni.template = '". $template ."' 
GROUP BY ni.letter_id;

Thay đổi này cũng sẽ tăng tốc truy vấn của bạn đáng kể.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hai bảng có cùng cột hay một bảng có thêm cột?

  2. Truy vấn Mysql với Left Join quá chậm

  3. cách lấy LAST_INSERT_ID thông qua thủ tục được lưu trữ trong php

  4. Hàm GREATEST () MySQL - Tìm đối số lớn nhất trong danh sách đối số

  5. Bảng ALTER - thêm AUTOINCREMENT trong MySQL