Подсчет вхождений различных значений в нескольких таблицах

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

Структура БД
Посмотреть на SQLFiddle

ТАБЛИЦА 1

user | value | id

ТАБЛИЦА 2

user | value | id

TABLE_3

user | value | id

Я могу запустить следующую команду MySQL, чтобы получить желаемые результаты по 1 таблице за раз.

SELECT value,COUNT(*) as count FROM TABLE_1 GROUP BY value ORDER BY count DESC;

Мне нужно выполнить эту команду одновременно для всех трех таблиц, чтобы получить уникальные вхождения «value» среди списка «users», который содержит множество дубликатов.

2

Решение

Учитывая ваши комментарии, так как вы хотите удалить дубликаты, используйте UNION объединить данные из таблиц вместе:

SELECT value, COUNT(*) as count
FROM (
SELECT user, value, id
FROM TABLE_1
UNION
SELECT user, value, id
FROM TABLE_2
UNION
SELECT user, value, id
FROM TABLE_3 ) t
GROUP BY value
ORDER BY count DESC;
3

Другие решения

Вам нужно использовать UNION —

SELECT value, COUNT(*) as count
FROM (
SELECT user, value, id
FROM TABLE_1
UNION
SELECT user, value, id
FROM TABLE_2
UNION
SELECT user, value, id
FROM TABLE_3 ) tables
GROUP BY value
ORDER BY count DESC;

Выход —

+-------+-----+
|car    |8    |
|boat   |4    |
|truck  |3    |
|house  |2    |
|skates |1    |
|bike   |1    |
+-------+-----+
1

согласиться с комментариями, это то, что я бы порекомендовал вам сделать.

настроить:

CREATE TABLE members (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
username varchar(255),
);

INSERT INTO members (username)
SELECT DISTINCT user FROM table1
UNION SELECT DISTINCT user FROM table2
UNION SELECT DISTINCT user FROM table3;

изменяющие:

ALTER table1
ADD COLUMN user_id INT(10)
ADD INDEX `user_id` (`user_id`);

ALTER table2
ADD COLUMN user_id INT(10)
ADD INDEX `user_id` (`user_id`);

ALTER table3
ADD COLUMN user_id INT(10)
ADD INDEX `user_id` (`user_id`);

обновление:

UPDATE table1 t,
JOIN members m ON m.username = t.username
SET t.user_id = m.id;

UPDATE table2 t,
JOIN members m ON m.username = t.username
SET t.user_id = m.id;

UPDATE table3 t,
JOIN members m ON m.username = t.username
SET t.user_id = m.id;

удаление ненормализованных данных

ALTER table1
DROP user;

ALTER table2
DROP user;

ALTER table3
DROP user;

теперь вы также можете настроить ограничения внешнего ключа на столбцы user_id и id, если хотите.

но чтобы запросить общее количество, вы можете просто присоединиться к таблицам .. убедитесь, что вы добавили индекс в каждое из полей id, чтобы оно правильно соединялось.

SELECT your_stuff
FROM members m
LEFT JOIN table1 t1 ON t1.user_id = m.id
LEFT JOIN table2 t2 ON t2.user_id = m.id
LEFT JOIN table3 t3 ON t3.user_id = m.id
1
По вопросам рекламы [email protected]