Таблицы MySQL UNION GROUP по столбцам

0

У меня есть два searches таблиц и recommended_searches. Оба имеют два столбца id и keyword

таблица поиска

id | keyword 
1  | one 
2  | two 
3  | one 
4  | one 
5  | two
6  | one

Рекомендуемая таблица

id | key 
1  | two 
2  | two 
3  | one 
4  | two 
5  | two
6  | one

Я использую этот запрос для возврата количества каждого ключевого слова в таблицу поиска

SELECT keyword, count(*) as cnt FROM searches GROUP BY keyword ORDER by cnt DESC

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

SELECT keyword, count(*) as cnt FROM recommended_searches GROUP BY keyword ORDER by cnt DESC

Я хочу ГРУППЕ ключом на этих двух таблиц, но cnt для таблицы поиска и recommended_cnt для recommended_search. Это значит, что я могу ORDER BY на основе типа таблицы, например, сортировать по рекомендуемым поисковым запросам.

SELECT keyword, count(*) as cnt FROM searches
UNION ALL
SELECT keyword, count(*) as recommended_cnt FROM recommended_searches
GROUP BY keyword ORDER by recommended_cnt DESC

Как вернуть оба cnt и recommended_cnt? Я пробовал и не работал.

я хочу получить результат вроде

Array(
[keyword] => one
[cnt] => 4
[recommended_cnt] => 2
);

Array(
[keyword] => two
[cnt] => 2
[recommended_cnt] => 4
);
  • 0
    Примечание: ключ - это ключевое слово MySQL, лучше изменить имя столбца.
  • 0
    Различные псевдонимы для одного и того же столбца в UNION ALL не будут работать. Если вы хотите иметь возможность сортировки по таблице, вам нужно добавить положение столбца, например, 1 для первого выбора и 2 для второго выбора.
Теги:

2 ответа

2

Поместите подсчеты в разные столбцы в двух подзапросах.

SELECT 'key', MAX(cnt) AS cnt, MAX(recommended_cnt) AS recommended_cnt
FROM (
    SELECT 'keyword' AS 'key', COUNT(*) AS cnt, 0 AS recommended_cnt
    FROM searches
    GROUP BY 'key'
    UNION ALL
    SELECT 'key', 0 AS cnt, COUNT(*) AS recommended_cnt
    FROM recommended_searches
    GROUP BY 'key'
) AS x
GROUP BY 'key'

DEMO

0

То, что вы хотите, это не СОЮЗ, вы хотите присоединиться к ним.

SELECT a.keyword, a.cnt AS cnt, b.cnt AS cnt_recommended
FROM
  (SELECT keyword, count(*) as cnt FROM searches GROUP BY keyword ORDER by cnt DESC) as a
LEFT OUTER JOIN
  (SELECT keyword, count(*) as cnt FROM recommended_searches GROUP BY keyword ORDER by cnt DESC) as b
  ON a.keyword = b.keyword
GROUP BY a.keyword
ORDER BY ...

Это объединит два запроса и даст для них счет отдельно. В зависимости от ваших требований тип соединения может быть другим.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню