2015-03-12 3 views
0

Привет, я не уверен, что это возможно: - У меня есть таблица с доставкой со многими столбцами, и это очень большая таблица, и это исходная таблица из моего AdServer.MySQL Выберите Distinct Records из более чем одного столбца таблицы

Из многих столбцов я хочу получить DISTINCT из 3-х столбцов (кампания, размещение, сайт). I. Четкие кампании с доставкой и отличное размещение с доставкой и отличным сайтом от доставки.

Я запускаю 3 разных SQL. Выберите для этого.

Есть ли способ, мы можем найти это из одного запроса, как работают несколько запросов замедляет это таблица имеет множество данных ...

В настоящее время я использую: -

SELECT 
(SELECT GROUP_CONCAT(DISTINCT campaign SEPARATOR '^^') FROM delivery) as campaign, 
(SELECT GROUP_CONCAT(DISTINCT placement SEPARATOR '^^') FROM delivery) as placement, 
(SELECT GROUP_CONCAT(DISTINCT site SEPARATOR '^^') FROM delivery) as site"; 

Это производительность проблемы, у нас есть лучшее решение, чем это.?

+0

Может быть лучше подход перепроектировать таблицы – Tschallacka

+1

привет @MichaelDibbets, это невозможно, так как эта таблица предоставляется моим сервером объявлений ... – Deejay

+0

В SQL 'SELECT DISTINCT' является« оператор строки », он выполняет по всей строке. Поэтому, если пытаться описать требования, будьте очень осторожны, как вы используете термин «отдельный», потому что он подразумевает «целую строку». Вы запрашиваете набор уникальных значений поля EACH. (Не отдельная строка, содержащая 3 столбца.) –

ответ

0

Вы можете использовать предложения GROUP BY с тремя полями:

SELECT campaign, placement, site FROM table_foo GROUP BY campaign, placement, site 

Одним важным вопросом с этим, которые будут применяться в этом случае, как вы говорите, что это «огромный» стол, что это будет использовать временную таблицу и выполнить сортировку файла, и обе из них могут иметь проблемы с производительностью.

+0

Это не сработает, так как это даст мне набор различных кампаний, размещения и сайта. как A, b, c; a, b1, c, где a * - кампания, а b * - размещение, а c * - сайт. – Deejay

+0

В этом случае, если есть 20 кампаний, 10 мест размещения и 3000 сайтов, должно быть ясно, что один запрос не может дать результат, который имеет как 20, так и 10 и 3000 строк в качестве ответа. –

0

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

select distinct 'campaign' as type, campaign as value 
union all 
select distinct 'placement', placement 
union all 
select distinct 'site', site 

Это предложение было подготовлено до того, как в вопросе был виден существующий запрос.

0

В зависимости от того, на каком сервере вы находитесь, но если последние данные не являются наивысшим приоритетом, вы можете разрешить задание cron каждые 5 минут с полями данных, которые вы хотите, и использовать SELECT INTO, чтобы выбрать его в «скомпилированная» таблица базы данных, из которой вы выбираете свои данные.

Обычный выбор данных из таблицы базы данных намного быстрее, чем операции, которые вы делаете сейчас, поэтому должно произойти значительное увеличение скорости. Единственный недостаток - ваши данные будут стоять каждые 5 минут. Но обычно сверхточные данные реального времени на самом деле не являются обязательным требованием.

Кроме этого, я не вижу реальный способ улучшить это, тем более, что вы используете CONCAT (строковые операции утомительно медленно)

+0

Привет, Есть некоторые случаи, когда я должен получать эти значения столбцов в соответствии с требованиями, например, если я хочу получить эти записи, где показы> 10000; и т. д., тогда этот подход не будет работать. – Deejay

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