Как получить данные двух колонок и посчитать количество?

Ссылка скопирована
1 ответ

Добрый день, уважаемые коллеги

На первый взгляд есть простая задача, но как решить оптимальным способом не могу придумать. Буду рад за любую помощь

Задача состоит в том чтобы получить все уникальные строки из двух колонок, и посчитать сколько раз всего попадалось каждое из значений в любой из этих же колонок + ограничение по дате

Запрос который у меня вышел

SELECT  	t.str, 	(SELECT COUNT(*) FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31' AND str1 = t.str OR str2 = t.str) as count FROM ( 	(SELECT DISTINCT str1 as str FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31') 	UNION 	(SELECT DISTINCT str2 as str FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31') ) as t

SELECT t.str, (SELECT COUNT(*) FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31' AND str1 = t.str OR str2 = t.str) as count FROM ( (SELECT DISTINCT str1 as str FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31') UNION (SELECT DISTINCT str2 as str FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31') ) as t

Запрос работает, но производительность хочется подтянуть. Сейчас запрос обрабатывает около 700к за 15 сек. Как можно оптимизировать и улучшить производительность этого запроса? Индексы стоят

Спасибо

Дополнительно:

Что такое str1 и str2 в условии отбора AND str1 = t.str OR str2 = t.str?

===

1) Исходный запрос содержит подзапрос, который выполнит аж три сортировки - две в своих подзапросах (ибо DISTINCT) и третью для объединённого набора (ибо UNION == UNION DISTCINT).

2) Условие по дате во внешнем запросе не имеет смысла, ибо условия подзапросов не пропустят несоответствующих этому условию записей.

3) Нет смысла волочь все записи наружу, чтобы потом из них опять делать выборку.

SELECT    t.str,   SUM(n) FROM (   (SELECT str1 as str, COUNT(*) as n FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY str1)   UNION   (SELECT str2 as str, COUNT(*) as n FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY str2) ) as t  GROUP BY t.str

SELECT t.str, SUM(n) FROM ( (SELECT str1 as str, COUNT(*) as n FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY str1) UNION (SELECT str2 as str, COUNT(*) as n FROM tableName WHERE date BETWEEN '2021-01-01' AND '2021-12-31' GROUP BY str2) ) as t GROUP BY t.str

  • сенкю
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

Для того чтобы получить данные из двух колонок и посчитать количество, вам нужно использовать SQL запрос к вашей базе данных. Вот пример как это можно сделать с использованием языка программирования PHP и MySQL:

connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
 
// SQL запрос для выборки данных из двух колонок и подсчета их количества
$sql = "SELECT column1, column2, COUNT(*) as count FROM your_table GROUP BY column1, column2";
 
$result = $conn->query($sql);
 
if ($result->num_rows > 0) {
    // Вывод данных
    while($row = $result->fetch_assoc()) {
        echo "Column 1: " . $row["column1"]. " - Column 2: " . $row["column2"]. " - Count: " . $row["count"]. "<br>";
    }
} else {
    echo "0 results";
}
 
$conn-&gt;close();
?&gt;

connect_error) { die("Connection failed: " . $conn-&gt;connect_error); } // SQL запрос для выборки данных из двух колонок и подсчета их количества $sql = "SELECT column1, column2, COUNT(*) as count FROM your_table GROUP BY column1, column2"; $result = $conn-&gt;query($sql); if ($result-&gt;num_rows &gt; 0) { // Вывод данных while($row = $result-&gt;fetch_assoc()) { echo "Column 1: " . $row["column1"]. " - Column 2: " . $row["column2"]. " - Count: " . $row["count"]. "<br>"; } } else { echo "0 results"; } $conn-&gt;close(); ?&gt;

В данном примере мы подключаемся к базе данных, выполняем SQL запрос для выборки данных из двух колонок и подсчета их количества с группировкой по этим колонкам. После чего выводим полученные данные на экран. Не забудьте заменить "localhost", "username", "password", "database" и "your_table" на ваши реальные данные.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно