2016-06-28 2 views
3

Я действительно не уверен, как это объяснить, так как я только начал изучать, как использовать MySQL-запросы более современным способом. Вот что у меня есть:Добавить столбцы для нескольких атрибутов в MySQL

SELECT pa.displayvalue as Brand 
FROM product p 
JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
WHERE p.isactive = 1 AND p.categoryid = 4871 
AND an.attributeid = 113319; 

Так что у меня этот запрос, и в буквальном смысле, все, что я хочу сделать, это добавить еще один столбец для «А an.attributeid = 113319»

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

Таким образом, столбец 1 будет иметь все значения, которые «И an.attributeid = 113319» тянет, а столбец два будет иметь все значения, которые тянет «And an.attributeid = 1762».

Я получил этот код для работы вид:

SELECT pa.displayvalue as Brand 
FROM product p 
JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
WHERE p.isactive = 1 AND p.categoryid = 4871 
AND an.attributeid = 113319; 

SELECT pa.displayvalue as Type 
FROM product p 
JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
WHERE p.isactive = 1 AND p.categoryid = 4871 
AND an.attributeid = 1762; 

Но это возвращается в Navicat в двух отдельных результатов. Я хочу, чтобы оба они были в одном результате, но как два столбца, а не два результата с одним столбцом.

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

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

Если у вас есть ЛЮБЫЕ предложения, я был бы очень признателен.

+1

То, что вы просите, довольно сложно сделать, и 99.999999999% времени не очень хорошая идея.Строки должны представлять связанные фрагменты данных, а не строки на странице, на которой вы нарисовали некоторые несвязанные столбцы. Когда вы ищете такой выход, лучше всего обращаться с ним на уровне приложения. – Uueerdo

+0

@Uueerdo полностью согласен. Я бы добавил два способа обращения с ним на уровне приложения: выполните два запроса и покажите результаты рядом друг с другом, или сделайте один промежуточный запрос, чтобы создать таблицу, содержащую оба результата, в одну таблицу, если соединения стоят дорого, а затем два запросов к этой таблице. – qoba

+0

Так что эти цифры, которые я пытаюсь изменить, они тянут атрибуты для продукта. Так что один номер вытащит фирменное наименование для кучи продуктов, а затем другой номер потянет все типы брендов. Я думаю, что я пытаюсь сделать, это создать CSV, который будет отображать Бренд, а затем Тип. Оба связаны друг с другом. Поэтому, если бы это было превосходно, заголовки были бы: «Бренд» и «Тип», а затем каждая строка была бы заполнена маркой и типом для каждого продукта. – DarkMatter

ответ

1

Если вы действительно хотите это сделать, для форматирования или создания отчетов. Это взлом, который вы использовали бы.

И использование LEFT JOIN будет возвращать все строки из левой таблицы с соответствующими строками в правой таблице. Результат игры: NULL справа.

SELECT p.productid, t2.Type, t1.Brand, t3.Resolution 
FROM product p 
JOIN 
( 
    SELECT p.productid, pa.displayvalue as Brand 
    FROM product p 
    JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
    JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
    JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
    JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
    WHERE p.isactive = 1 AND p.categoryid = 4871 
    AND an.attributeid = 113319 
) t1 ON t1.productid = p.productid 
LEFT OUTER JOIN 
( 
    SELECT p.productid, pa.displayvalue as Type 
    FROM product p 
    JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
    JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
    JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
    JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
    WHERE p.isactive = 1 AND p.categoryid = 4871 
    AND an.attributeid = 1100 
) t2 ON t2.productid = p.productid 
LEFT OUTER JOIN 
( 
    SELECT p.productid, pa.displayvalue as Resolution 
    FROM product p 
    JOIN categoryheader ch ON ch.templatetype = 0 AND p.categoryid=ch.categoryid AND ch.isactive=1 
    JOIN categorydisplayattributes cda ON ch.headerid = cda.headerid AND ch.categoryid = cda.categoryid AND cda.templatetype = ch.templatetype AND cda.isactive=1 
    JOIN productattribute pa ON p.productid = pa.productid AND cda.attributeid = pa.attributeid AND pa.localeid = 1 AND pa.isactive =1 
    JOIN attributenames an ON pa.attributeid = an.attributeid AND an.localeid = 1 
    WHERE p.isactive = 1 AND p.categoryid = 4871 
    AND an.attributeid = 1762 
) t3 ON t3.productid = p.productid 
+0

Это приводит к созданию 1mil + строк данных, однако это должно быть только 27. – DarkMatter

+0

Здесь я использовал жестко закодированный ключ '1', если вы просто выводите одно значение строки. Если есть несколько строк, лучше связать 'JOIN' с внешним ключом. Я предполагаю, что есть идентификатор продукта, который вы можете использовать. – ydoow

+0

@DarkMatter также будет лучше, если бы вы могли предоставить образцы данных и желаемый результат. – ydoow

1

Вы можете сделать что-то вроде этого

... AND an.attributeid IN (113319, 1762)

Это вернет вам две строки с одной колонкой.

Если вы хотите перенести строки в столбцы, это немного усложняется.

1

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

Такого рода вещи будет делать трюк

SELECT whatever, 
     attr1.displayvalue attr1, 
     attr2.displayvalue attr2 
    FROM product p 
    LEFT JOIN productattribute attr1 ON p.productid = attr1.productid 
            AND attr1.attributeid = 113319 
            AND attr1.localeid = 1 
            AND attr1.isactive = 1 
    LEFT JOIN productattribute attr2 ON p.productid = attr2.productid 
            AND attr2.attributeid = 1762 
            AND attr2.localeid = 1 
            AND attr2.isactive = 1 

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

Очень распространенным примером в дикой природе этой организации данных является таблица wp_postmeta в WordPress.

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