2017-01-10 3 views
0

Я загружаю большое количество данных для создания фида. В этом процессе должно быть левое соединение, которое добавляет дополнительные данные. Поэтому вы понимаете, что высокий спрос на производительность.SQL Сохранять заказ по умолчанию, но применять подотряд для левого соединения

Заказ по первому идентификационному номеру не требуется - поэтому не нужно, но необходимо заказать левую деталь.

Рассмотрим следующий пример:

SELECT p.*, atts.name 
FROM products as p 
LEFT JOIN attributes as atts ON p.product_id = atts.product_id 

Теперь то, что мне нужно, чтобы добавить что-то вроде

ORDER BY ??DEFAULT_PRODUCT_ORDER??, atts.position ASC 

Я пытался искать этот вопрос, но ближе всего я нашел заканчивался с группой по/макс отвечает ...

Использование: MySQL/MariaDB

EDIT: Я также думал о предварительной обработке атрибутов в SQL подзапросом, который будет упорядочивать их и конкатенировать их как 1 столбец - но это было бы не так эффективно?

+0

где порядок по умолчанию, хранящийся?, можете ли вы добавить свои структуры таблиц – happymacarts

+0

@happymacarts нигде :) Цель состоит в том, чтобы загрузить таблицу продуктов «как есть» (поэтому наиболее эффективным способом) –

+0

Я не уверен, что понимаю ваше желание. вы хотите, чтобы он был «как есть» и отсортирован, предоставляют некоторые данные образца и то, что вы хотите, чтобы он выглядел. Сколько строк данных вы говорите? – happymacarts

ответ

1

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

SELECT p.*, group_concat(atts.name) 
FROM products as p 
LEFT JOIN attributes as atts ON p.product_id = atts.product_id 

Group BY /*all columns not included in aggregate (noc necc for mysql but other dbs like mssql get crazy about that*/ 
0

«порядок по умолчанию» для выхода в SELECT «что угодно».

Являются ли столы InnoDB? Я так и допущу.

Что такое PRIMARY KEY от products? Я буду считать (product_id)

(Это было бы удобно, если вы предоставили SHOW CREATE TABLE для обеих таблиц.)

ли attributesPRIMARY KEY(product_id, position)? Если нет, то это должно произойти. Это часть проблемы производительности.

Тогда вам понадобится ORDER BY p.product_id, atts.position, но ни один из индексов не будет использоваться, поскольку индекс не может охватывать две таблицы. (Нет, это не поможет изменить p. к atts. Оптимизатор достаточно умен, чтобы увидеть p.product_id и atts.product_id как взаимозаменяемые.)

Но ... Вам действительно нужно LEFT ?? С его помощью вы показываете NULL для atts.name, когда нет строки atts. Может, этого никогда не произойдет? В этом случае перетащите LEFT, чтобы JOIN мог перейти в другую сторону. ТеперьORDER BY и INDEXes могут вступить в игру.

Без LEFT, я предсказываю, что EXPLAIN SELECT... покажет atts в качестве первой таблицы и выполнит полное сканирование таблицы. Затем он будет обращаться к другой таблице несколько раз, используя свой ПК. Нет «Использовать временный» или «Использовать файловый порт».

(Если вы хотите продолжить обсуждение, отредактировать вопрос о включении SHOW CREATE TABLE и EXPLAIN SELECT ....)

+0

Давайте предположим, что 'attributes' не имеет такого« PRIMARY KEY », поскольку такая же позиция может иметь место для любого количества атрибутов для одного и того же' product_id'. Можете ли вы рассказать о том, как это влияет на производительность? То же самое касается InnoDB и MyISAM? В любом случае, это действительно общий вопрос - так что вы не можете предположить из запроса считать несуществующим. LEFT определенно необходим, потому что все продукты нужны, хотя только некоторые могут иметь атрибуты - я ошибаюсь? –

+0

'LEFT' - ОК. Используйте InnoDB. Давайте посмотрим 'SHOW CREATE TABLE'. –

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

  • Нет связанных вопросов^_^