Đối với ứng dụng hẹn hò, tôi có một vài bảng cần truy vấn cho một đầu ra duy nhất với LIMIT 10 của cả hai truy vấn được kết hợp. Có vẻ như khó có thể thực hiện vào lúc này, mặc dù không phải là vấn đề để truy vấn chúng một cách riêng biệt, nhưng LIMIT 10 sẽ không hoạt động vì các con số không chính xác (ví dụ: không phải LIMIT 5 và LIMIT 5, một truy vấn có thể trả về 0 hàng , trong khi 10 khác, tùy thuộc vào kịch bản).MySQL - Kết hợp hai câu lệnh chọn thành một kết quả với LIMIT hiệu quả
members table
member_id | member_name
------------------------
1 Herb
2 Karen
3 Megan
dating_requests
request_id | member1 | member2 | request_time
----------------------------------------------------
1 1 2 2012-12-21 12:51:45
dating_alerts
alert_id | alerter_id | alertee_id | type | alert_time
-------------------------------------------------------
5 3 2 platonic 2012-12-21 10:25:32
dating_alerts_status
status_id | alert_id | alertee_id | viewed | viewed_time
-----------------------------------------------------------
4 5 2 0 0000-00-00 00:00:00
Hãy tưởng tượng bạn là Karen và chỉ cần đăng nhập, bạn sẽ thấy những 2 hạng mục:
1. Herb requested a date with you.
2. Megan wants a platonic relationship with you.
Trong một truy vấn với một LIMIT của 10 Thay vì đây là hai câu hỏi cần phải được kết hợp:
1. Herb requested a date with you.
-> query = "SELECT dr.request_id, dr.member1, dr.member2, m.member_name
FROM dating_requests dr
JOIN members m ON dr.member1=m.member_id
WHERE dr.member2=:loggedin_id
ORDER BY dr.request_time LIMIT 5";
2. Megan wants a platonic relationship with you.
-> query = "SELECT da.alert_id, da.alerter_id, da.alertee_id, da.type,
da.alert_time, m.member_name
FROM dating_alerts da
JOIN dating_alerts_status das ON da.alert_id=das.alert_id
AND da.alertee_id=das.alertee_id
JOIN members m ON da.alerter_id=m.member_id
WHERE da.alertee_id=:loggedin_id AND da.type='platonic'
AND das.viewed='0' AND das.viewed_time<da.alert_time
ORDER BY da.alert_time LIMIT 5";
Một lần nữa, đôi khi cả hai bảng có thể trống hoặc 1 bảng đầy đủ (trong đó LIMIT 10 bắt đầu) và sắp xếp theo thời gian. Bất kỳ ý tưởng về cách để có được một truy vấn để thực hiện nhiệm vụ này một cách hiệu quả? Suy nghĩ, lời khuyên, chuông, tối ưu hóa được hoan nghênh.
Nếu các cột được trả về bởi hai truy vấn giống nhau, hãy nối chúng với ['UNION'] (http://dev.mysql.com/doc/refman/5.6/en/union.html) và tạo toàn bộ điều truy vấn con đến truy vấn bên ngoài thực hiện 'LIMIT'. Nếu không, bạn có thể xác định 'LIMIT' cần thiết để áp dụng cho truy vấn thứ hai từ (10 trừ số lượng bản ghi được trả về bởi truy vấn đầu tiên) - có lẽ dễ nhất để làm điều này bằng bất kỳ ngôn ngữ nào bạn đang sử dụng để gọi truy vấn. – eggyal
Tạo bảng với kết quả mong đợi của bạn. Bạn sẽ thấy vấn đề ở đó. –
Không thể kết hợp 2 truy vấn với các danh sách lựa chọn khác nhau. – vyegorov