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

Làm cách nào để xuất kết quả khớp sau khi so sánh hai bảng?

Đối với điều này, bạn muốn group by chart_num và truy cập. Bất kỳ hàng nào có cùng chart_num và lượt truy cập sẽ xuất hiện dưới dạng một hàng duy nhất trong kết quả. Sau đó, bạn có thể sum số tiền nhận được, điều này sẽ cộng lại tất cả các giá trị cho một nhóm.

select
  chart_num,
  visit,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

chart_name là một vấn đề. Bạn không thể hiển thị nó vì nó không thuộc nhóm group by . Đó là một chuỗi nên không hợp lý khi tổng hợp nó với các hàm như sum hoặc count . Mặc dù trong dữ liệu chart_num có cùng tên chart_name, nhưng điều đó không được đảm bảo.

Một giải pháp là sử dụng group_concat để ghép từng tên trong một nhóm với nhau. Mỗi nhóm chỉ nên có một tên.

select
  chart_num,
  visit,
  group_concat(chart_name) as chart_name,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

Tuy nhiên, giải pháp thích hợp là sửa chữa lược đồ. chart_name bị trùng lặp và điều đó cần tránh. Thay vào đó, hãy di chuyển các cột biểu đồ vào bảng của riêng chúng. Sau đó, để lấy tên biểu đồ, hãy tham gia trên chart_num.

create table charts (
  id serial primary key,
  name varchar(255) not null
);

insert into charts (id, name) values
  (4, 'user1'), (5, 'user2'), (6, 'user3'), (7, 'user4');

alter table table1 drop column chart_name;

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received
from table1
join charts on charts.id = chart_num
group by chart_num, visit

Chúng ta cần một phép nối bên trái với bảng thứ hai khớp với ngày_thẻ với lượt truy cập. Nối bên trái có nghĩa là tất cả các hàng trong bảng "bên trái" (tức là. from bảng) sẽ luôn xuất hiện ngay cả khi không có kết quả phù hợp nào trong bảng tham gia .

chuyến thăm là một cuộc hẹn hò. card_date không phải là một ngày mà là một dấu thời gian. Để khớp với chúng, chúng tôi sẽ cần chuyển đổi card_date đến một ngày.

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  table2.card_date,
  table2.advanced_amount as amount
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit

Chúng ta cần so sánh số_trung_cấp với tổng (số_lượng_bài_tính). Nếu chúng bằng nhau:ok. Nếu không:lỗi. Trong SQL tiêu chuẩn, chúng tôi sử dụng case , nhưng MariaDB có if không chuẩn nhỏ gọn hơn nhiều.

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  table2.card_date,
  table2.advanced_amount as amount,
  if(table2.advanced_amount = sum(card_amount_received), 'ok', 'error') as result
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. php lỗi kết nối MySql

  2. liên kết cơ sở dữ liệu giữa hai máy chủ mysql chạy ở hai vị trí khác nhau

  3. Lỗi MySQL 1264:giá trị ngoài phạm vi cho cột

  4. Sử dụng nhóm cột làm khóa duy nhất trong MySQL

  5. MySQL - length () so với char_length ()