0

我目前有:

SELECT tbl_review.*, users.first_name, users.last_name, (
    SELECT order_ns.tran_date 
    FROM order_ns 
    LEFT JOIN product_2_order_ns.external_order_id = order_ns.order_id 
    WHERE product_2_order_ns.bkfno IN :id
    ORDER BY order_ns.trandate ASC 
    LIMIT 1
) as purchase_date
FROM tbl_review
LEFT JOIN users ON users.sequal_user_id = tbl_review.user_id
WHERE tbl_review.product_id IN :id AND tbl_review.approved = 1

其中,在其子查询中,选择用户拥有的具有问题产品的订单(在 中定义:id)获取已找到订单之一的最早交易日期。

我真的很想将其保留在数据库的一次调用中(真的不想为每个返回的用户再次调用一个字段,甚至对所有用户进行范围查询)但显然这个特定的查询不起作用.

如果有的话,我该怎么做才能让它工作?

我不能将子查询变成连接,因为它们是两个不同的数据,子查询需要返回主查询中每一行的详细信息。

4

2 回答 2

1

我想你只想要一个相关的子查询。目前还不清楚内部查询和外部查询之间的关系究竟是什么。我的猜测是它在用户和订单上:

SELECT tbl_review.*, users.first_name, users.last_name,
       (SELECT order_ns.tran_date 
        FROM order_ns LEFT JOIN
             product_2_order_ns
             on product_2_order_ns.external_order_id = order_ns.order_id and
                product_2_order_ns.bkfno = tbl_review.product_id and
        WHERE order_ns.user_id = tbl_review.user_id
        ORDER BY order_ns.trandate ASC 
        LIMIT 1
       ) as purchase_date
FROM tbl_review LEFT JOIN
     users
     ON users.sequal_user_id = tbl_review.user_id
WHERE tbl_review.product_id IN :id AND tbl_review.approved = 1;

编辑:

哦,内部查询与外部查询没有关系然后就容易多了。使用以下命令将其移至from子句cross join

SELECT tbl_review.*, users.first_name, users.last_name,
       innerquery.tran_date as purchase_date
FROM tbl_review LEFT JOIN
     users
     ON users.sequal_user_id = tbl_review.user_id cross join
     (SELECT order_ns.tran_date 
      FROM order_ns LEFT JOIN
           product_2_order_ns
           on product_2_order_ns.external_order_id = order_ns.order_id 
      WHERE product_2_order_ns.bkfno IN :id
      ORDER BY order_ns.trandate ASC 
      LIMIT 1
     ) innerquery
WHERE tbl_review.product_id IN :id AND tbl_review.approved = 1;
于 2013-09-11T15:08:56.957 回答
0

@Gordons 的答案非常接近,但即使没有找到 tran_date 的数据,我也希望它返回,所以我将查询更改为:

SELECT tbl_review.*, users.first_name, users.last_name, order_ns.tran_date
FROM tbl_review
LEFT JOIN users ON users.sequal_user_id = tbl_review.user_id 
LEFT JOIN order_ns ON order_ns.order_id = (
    SELECT order_ns.order_id 
    FROM order_ns
    LEFT JOIN product_2_order_ns on product_2_order_ns.external_order_id = order_ns.order_id
            WHERE product_2_order_ns.bkfno IN :id
    ORDER BY order_ns.tran_date ASC
    LIMIT 1
 ) 
 WHERE tbl_review.product_id IN :id AND tbl_review.approved = 1;    

tran_date无论是否找到它,这都会返回不同的数据。

于 2013-09-12T09:12:17.477 回答