2013-09-11 5 views
0

я в настоящее время:MySQL Выбор сложный суб запрос в поле

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) Получить самая старая дата транзакции в файле для одного из найденных заказов.

Я бы очень хотел, чтобы это было связано с одним вызовом базы данных (на самом деле не хотите снова звонить для каждого возвращаемого пользователя только для одного поля или даже делать запрос диапазона для всех пользователей), но, очевидно, этот конкретный запрос не работает.

Что делать, если что-нибудь, чтобы заставить это работать?

Я не могу сделать дополнительный запрос в объединении, так как они представляют собой две отдельные части данных, подзапрос должен возвращать детали для каждой строки в основном запросе.

+1

Какая ошибка. вы можете сделать sqlfiddle для этого. – developerCK

+0

По моему опыту синтаксис «IN» принимает диапазон значений как «массив», поэтому вы должны делать что-то вроде 'IN ('value1')'. Если это вещь PDO, вам понадобится 'IN (: id)'. Если вы не проходите в нескольких значениях, тогда будет равен равный знак '=' – MonkeyZeus

+0

@MonkeyZeus. У меня на самом деле есть библиотека PDO, которая делает это для меня. – Sammaye

ответ

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 независимо от того, найден он или нет.

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; 

EDIT:

Oh, внутренний запрос имеет никакого отношения к внешнему запросу. Тогда это проще. Переместить его в положение 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; 
+0

Это то, что внутренний запрос не имеет отношения к внешнему запрос, это в основном лишний кусок данных, который я бы хотел получить, не выполняя другой запрос с PHP, я попробую это и посмотрю, будет ли он работать – Sammaye

+0

Nah не будет принимать JOIN, я помню, что блокирование JOIN MySQL по тем или иным причинам, я получил все больше и больше ощущения, что мне придется сделать эти два вопроса: – Sammaye

+0

@Sammaye. , , См. Отредактированный ответ. Я не понял этого вопроса. –

Смежные вопросы