результаты заказа на основе условий соединения - PullRequest
1 голос
/ 07 декабря 2011

Есть 3 таблицы MySQL.

BOOKS have ID, AUTHOR1, AUTHOR2, PUBLISHER1, PUBLISHER2
AUTHORS have ID, WEBSITE
PUBLISHERS have ID, WEBSITE

Не у всех издателей или авторов есть веб-сайт.

У меня есть запрос, который возвращает совпадающие наборы сайтов авторов и издателей для данного идентификатора книги. Если у них у всех есть сайт, это будет означать 2 строки.

SELECT AUTHORS.WEBSITE as WEB1, PUBLISHERS.WEBSITE as WEB2
FROM BOOKS
LEFT OUTER JOIN AUTHORS ON (ID=AUTHOR1 OR ID=AUTHOR2)
LEFT OUTER JOIN PUBLISHERS ON (ID=PUBLISHER1 OR ID=PUBLISHER2)
WHERE BOOK.ID ='12345'
LIMIT 2

Хотя это работает, в конечном итоге возвращается строка, соответствующая второму автору и издателю, перед первым автором и издателем. Возможно в алфавитном порядке.

Как сделать так, чтобы этот запрос сначала возвращал строку, содержащую сайты AUTHOR1 и PUBLISHER1?

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Я бы отнесся к ним как к отдельным соединениям и использовал бы COALESCE.

SELECT COALESCE(A1.WEBSITE, A2.WEBSITE) as WEB1, 
       COALESCE(P1.WEBSITE, P2.WEBSITE) as WEB2
FROM BOOKS B
LEFT OUTER JOIN AUTHORS A1 ON A1.ID=B.AUTHOR1 
LEFT OUTER JOIN AUTHORS A2 ON A2.ID=B.AUTHOR2
LEFT OUTER JOIN PUBLISHERS P1 ON P1.ID=B.PUBLISHER1 
LEFT OUTER JOIN PUBLISHERS P2 ON P2.ID=B.PUBLISHER2
WHERE B.ID ='12345'
0 голосов
/ 07 декабря 2011

Поскольку в запросе нет порядка по пунктам, вы можете быть уверены, что результаты, упорядоченные в алфавитном порядке, являются простым совпадением.

В любом случае

SELECT AUTHORS.WEBSITE as WEB1, PUBLISHERS.WEBSITE as WEB2
FROM BOOKS
LEFT OUTER JOIN AUTHORS ON (ID=AUTHOR1)
LEFT OUTER JOIN PUBLISHERS ON (ID=PUBLISHER1)
WHERE BOOK.ID ='12345'
UNION
SELECT AUTHORS.WEBSITE as WEB1, PUBLISHERS.WEBSITE as WEB2
FROM BOOKS
LEFT OUTER JOIN AUTHORS ON (ID=AUTHOR2)
LEFT OUTER JOIN PUBLISHERS ON (ID=PUBLISHER2)
WHERE BOOK.ID ='12345'
LIMIT 2
...