CHỌN nhiều cột thông qua truy vấn con


18

Tôi đang cố gắng CHỌN 2 cột từ truy vấn con trong truy vấn sau, nhưng không thể làm như vậy. Đã thử tạo bảng bí danh, nhưng vẫn không thể có được chúng.

SELECT
  DISTINCT petid,
  userid,
  (SELECT MAX(comDate) FROM comments WHERE petid=pet.id) AS lastComDate,
  (SELECT userid FROM comments WHERE petid=pet.id ORDER BY id DESC LIMIT 1) AS lastPosterID
FROM 
  pet LEFT JOIN comments ON pet.id = comments.petid
WHERE 
  userid='ABC'      AND 
  deviceID!='ABC'   AND 
  comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH);

Về cơ bản, tôi đang cố gắng lấy lastComDate& lastPosterIDtừ cùng một hàng - hàng mới nhất trong các nhận xét cho thú cưng cụ thể. Xin đề nghị làm thế nào tôi có thể nhận được chúng một cách hiệu quả.

Truy vấn trên hoạt động, nhưng có vẻ quá mức vì cùng một hàng được tìm nạp hai lần. Hơn nữa, ORDER BYmệnh đề chậm hơn đáng kể so với hàm tổng hợp - như tôi đã tìm thấy trong khi định hình truy vấn. Vì vậy, một giải pháp tránh sắp xếp sẽ được đánh giá cao.


1
Nếu bạn có một chỉ mục (petid, id) trên bảng nhận xét, thứ tự có thể sẽ không chậm, nhưng điều đầu tiên: Có vẻ như truy vấn của bạn đang yêu cầu tất cả các vật nuôi mà người dùng 'ABC' đã nhận xét chúng trong vòng hai tháng qua, trong đó deviceID không phải là 'ABC' (mặc dù không rõ IDID của bảng nào là cột, có thể là vật nuôi và có thể là bình luận) và ai là người bình luận cuối cùng, và ngày bình luận cuối cùng. Có đúng không?
Michael - sqlbot

@ Michael-sqlbot - Vâng, đó chính xác là những gì tôi đang cố gắng thu thập. Các deviceIDtừ petsbảng - nghĩa là chỉ không làm cho tôi những vật nuôi được gửi bởi 'ABC' chính mình.
BufferStack

Câu trả lời:


12
SELECT DISTINCT petid, userid, lastComDate, lastPosterId
FROM 
    pet 
    LEFT JOIN comments ON pet.id = comments.petid 
    LEFT JOIN (
        SELECT MAX(comDate), userid, petid FROM comments GROUP BY userid
    ) a ON a.petid = pet.id
WHERE 
    userid='ABC' 
    AND deviceID!='ABC' 
    AND comDate>=DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 2 MONTH)
;

Bạn cũng có thể kéo truy vấn con của mình ra một bảng tạm thời nếu hiệu suất bị ảnh hưởng ở đâu đó trên đường.


Tôi cũng đã thử điều này sớm hơn ... điều này trả lại NULLcho cả lastComDate& lastPosterIdcho tất cả các hồ sơ.
BufferStack

Bạn có bất kỳ dữ liệu mẫu có sẵn?
Valkyrie

Làm cách nào để cung cấp dữ liệu mẫu?
BufferStack

Hãy thử các gợi ý trong bài đăng này: meta.stackexchange.com/questions/156729/NH
Valkyrie

1
Điều đó tốt, nhưng SQLFiddle thì tốt hơn;). Xem một ví dụ ở đây . Cách tốt hơn để chỉ xem mã và dữ liệu hạt giống, không phải một số bảng bạn sẽ cần định dạng.
Mary

6

Cho rằng các bảng của bạn trông như thế này:

create table pet (id int, userid int, deviceid int);
create table comments (id int, petid int, comdate date);

Truy vấn này nên thực hiện thủ thuật:

SELECT 
        p.id, 
        p.userid,
        (SELECT MAX(comDate)
         FROM comments
         WHERE petid = p.id
         AND comDate >= DATE_SUB(
                 CURRENT_TIMESTAMP, INTERVAL 2 MONTH)
               ) AS lastComDate,
        (SELECT userid
         FROM comments
         WHERE petid = p.id
         AND comDate >= DATE_SUB(
              CURRENT_TIMESTAMP, INTERVAL 2 MONTH
         ) ORDER BY id DESC LIMIT 1) AS lastPosterID
    FROM 
        pet p

    WHERE 
        p.userid=1
        AND p.deviceID!=1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.