2012-02-22 3 views
1

у меня есть этот SQL-запрос:SQL заказ с присоединиться

SELECT b.topbid, b.topdate, a.* 
FROM auction_items a 
LEFT JOIN 
    (SELECT itemID, MAX(bid) as topbid, 
    MAX(date) as topdate FROM auction_bids GROUP BY itemID) b 
ON a.id = b.itemID 
ORDER BY b.topdate DESC, a.date DESC LIMIT 20 

Это не приказывая, как я хотел бы, чтобы это. Я хочу его заказать, объединив b.topdate и a.date.

Что не так?

+0

Что делать вы означает «порядок» путем объединения «a.topdate» и «b.date»? –

+0

, так что если b.topdate выше a.date, он будет выше. – user1022585

+0

Тогда, похоже, это то, что вы сделали: 'order by b.topdate desc, a.date desc'. –

ответ

0

Вы не можете иметь его поручение и b.topdate и a.date, потому что они оба могли иметь значение. Если вы можете сказать, что, когда они оба имеют значение, которое вы должны использовать один над другим (например, topdate по дате), вы можете сделать это следующим образом:

SELECT b.topbid, b.topdate, a.* 
FROM auction_items a 
LEFT JOIN 
    (SELECT itemID, MAX(bid) as topbid, 
    MAX(date) as topdate FROM auction_bids GROUP BY itemID) b 
ON a.id = b.itemID 
ORDER BY COALESCE(b.topdate, a.date) DESC LIMIT 20 

Обратите внимание на заказ. Если его наоборот, сделать его COALESCE (a.date, b.topdate)

+0

спасибо, не был знаком с COALESCE – user1022585

+0

, так что это исправить вашу проблему? –

+0

да, работает так, как должно – user1022585

1

Вы имеете в виду заказ, объединив два значения? если да, то попробуйте следующее:

SELECT b.topbid, b.topdate, a.* 
FROM auction_items a 
LEFT JOIN 
    (SELECT itemID, MAX(bid) as topbid, 
    MAX(date) as topdate FROM auction_bids GROUP BY itemID) b 
ON a.id = b.itemID 
ORDER BY b.topdate || a.date DESC LIMIT 20 

Я не уверен, что RDBMS вы находитесь, но Oracle конкатенация трубы ||

EDIT: при использовании MySQL с помощью функции CONCAT:

SELECT b.topbid, b.topdate, a.* 
    FROM auction_items a 
    LEFT JOIN 
     (SELECT itemID, MAX(bid) as topbid, 
     MAX(date) as topdate FROM auction_bids GROUP BY itemID) b 
    ON a.id = b.itemID 
    ORDER BY CONCAT(b.topdate,a.date) DESC LIMIT 20 
+1

Похож на MySQL, а не на Oracle. Судя по истории вопроса OP, это почти наверняка MySQL ... – Yuck

+0

спасибо, я никогда не думал проверять историю оп, хорошая идея на будущее. – northpole

0

Попробуйте выбрать один или другой с помощью сазе, то порядок этой величины вместо:

SELECT b.topbid, b.topdate, a.* , CASE WHEN b.topdate > a.date then b.topdate ELSE a.date  END AS oDate 
FROM auction_items a 
LEFT JOIN 
    (SELECT itemID, MAX(bid) as topbid, 
    MAX(date) as topdate FROM auction_bids GROUP BY itemID) b 
ON a.id = b.itemID 
ORDER BY oDate DESC LIMIT 20 
Смежные вопросы