2016-03-02 3 views
0

Я пытаюсь выбрать результаты из двух разных несвязанных таблиц, showcase и questions, чтобы появиться в фиде. Они должны быть заказаны общим столбцом hotness, который является значением поплавка.Соедините две разные таблицы, упорядоченные по общей ценности (горячая)

SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar 
FROM showcase AS s 
INNER JOIN users AS u ON s.user_id = u.id 
UNION 
SELECT q.id,q.date,q.title,q.views,q.text,u.display_name,u.avatar,0,0,0 
FROM questions AS q 
INNER JOIN users AS u ON q.user_id = u.id 
ORDER BY hotness DESC 
LIMIT 10 

Я попытался UNION, но я понятия не имею, как я должен использовать его здесь и получить эту ошибку unknown column hotness

+0

Меня не удивляет, что столбец неизвестен, потому что я вижу его нигде в запросе, кроме как в 'ORDER BY'. –

+0

Да, не знаю, что делать. Его не нужно выбирать, а просто заказывать. – frosty

+0

- это жара в пользовательских или витринных таблицах? и даже если это ... подумайте о порядке операций. Запрос 1 приводит к запросу 2 результата, слиянию и получению отдельных значений, затем сортировке. Двигатель не имеет возможности вернуться к базовым таблицам, чтобы получить горячий характер (при условии, что он находится в одной из таблиц). – xQbert

ответ

0

Вы должны выбрать значение, чтобы для ORDER BY признать это:

SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar, s.hotness 
FROM showcase AS s 
INNER JOIN users AS u ON s.user_id = u.id 
UNION ALL 
SELECT q.id,q.date,q.title,q.views,q.text,u.display_name,u.avatar,0,0,0, q.hotness 
FROM questions AS q 
INNER JOIN users AS u ON q.user_id = u.id 
ORDER BY hotness DESC; 

Обратите внимание, что я также изменил UNION к UNION ALL. Если вы не собираетесь удалять дубликаты, нет причин для дополнительной обработки для этого.

+0

Это работает вместе с ответом @ metfan. Что лучше?? Хотя я не понимаю его ответа – frosty

+0

@frosty. , , Они очень похожи. В общем случае в MySQL вы не хотите использовать подзапросы в предложении 'FROM', если это необходимо, потому что MySQL материализует подзапросы - ненужные служебные данные. Тем не менее, 'ORDER BY' также вызывает материализацию, поэтому не использовать подзапросы в этом случае - это просто (хорошая) привычка. Кроме того, стоит упомянуть «UNION» и «UNION ALL». –

+0

О, правда, с этой последней точкой. Я принял твое. – frosty

0

Вы можете попробовать этот запрос:

SELECT r.* FROM (
    SELECT s.id,s.date,s.title,s.views,s.image,s.hidpi,s.width,s.description,u.display_name,u.avatar, s.hotness 
    FROM showcase AS s 
    INNER JOIN users AS u ON s.user_id = u.id 
    UNION 
    SELECT q.id,q.date,q.title,q.views,q.text,u.display_name,u.avatar,0,0,0, q.hotness 
    FROM questions AS q 
    INNER JOIN users AS u ON q.user_id = u.id 
) as r 
ORDER BY r.hotness DESC 
LIMIT 10 

Вам нужно Объединить результат объединения в подзапрос, чтобы применить Order by по результату. Я также добавил горячность в select select, пожалуйста, проверьте, что я беру поле из хорошей таблицы.

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