MySQL показывать реестры такой таблицы как колонны другой

У меня есть таблица articulos

-------------------------  
|id|descripcion|color   |  
|--|-----------|--------|  
|1 |caja       |rojo    |  
|2 |baul       |azul    |  
|3 |cofre      |amarillo|  
-------------------------

И другая таблица atributos

---------------------------  
|id |id_art|nombre |valor |
|---|------|-------|------|  
|1  |1     |alto   |150   |
|2  |1     |ancho  |300   |
|3  |1     |peso   |12    |
|4  |1     |stock  |8     |
|5  |2     |alto   |100   |
|6  |2     |ancho  |200   |
|7  |2     |peso   |10    |
|8  |3     |ancho  |300   |
---------------------------

То, в чем я нуждаюсь, состоит посредством query консультации, в том, чтобы добиваться, чтобы признаки статьи вели себя как колонны, чтобы просачиваться по стоимости тех же самых, или же:

-----------------------------------------------  
|id|descripcion|color   |alto|ancho|peso|stock|  
|--|-----------|--------|----|-----|----|-----|  
|1 |caja       |rojo    |150 |300  |12  |8    |  
|2 |baul       |azul    |100 |200  |10  |null |  
|3 |cofre      |amarillo|null|300  |null|null |  
-----------------------------------------------

чтобы таким образом просачиваться по тем же самым или показывать их.
select * from articulos where alto = 150 and ancho = 300

С уже, большое спасибо.

2
задан 13.07.2017, 14:50
4 ответа

introducir la descripción de la imagen aquí Я Достиг списка, в котором ты нуждаешься, с instrucci¦n женил when и sum

select ar.id, ar.descripcion, ar.color, 
  sum(case when at.nombre = "alto"  then valor end) as alto,
  sum(case when at.nombre = "ancho" then valor end) as ancho,
  sum(case when at.nombre = "peso"  then valor end) as peso,
  sum(case when at.nombre = "stock" then valor end) as stock 
from articulos ar inner join atributos at
              on ar.id = at.id_art 
group by 1,2,3 ;
0
ответ дан 24.11.2019, 07:35

Хорошие, soluci¦n mÃ: s доступный в твою проблему (в мой способ видеть) он состоит в том, чтобы реализовывать JOIN, (ты можешь получать mÃ: s informaci¦n на типах JOIN aquà - ). Придавать особое значение тому, что, если ты организовал колонну распределяя имя многому mà и después давая ему стоимость (уважая id статей), ser¦-: s простой (и l¦gico).

BÃ: sicamente консультация (что со мной случается), что mÃ: s приблизьтесь к тому, что ты желаешь, он:

SELECT * FROM articulos JOIN atributos ON articulos.id = atributos.id_art WHERE atributos.id_art = 1 AND IF (atributos.nombre = 'alto' AND atributos.valor = 150,TRUE,FALSE) OR IF(atributos.nombre = 'ancho' AND atributos.valor = 300,TRUE,FALSE)

Ответ на эту консультацию (основываясь на данных о твоей таблице) - стоимость: ширина = 300 и высота = 150 (видеть изображение), подтверждая, что существует эта стоимость для статьи (id.art) 1.

Пример grÃ: fico (click в изображении, чтобы видеть лучше): introducir la descripción de la imagen aquí

А именно, для этого случая, ящик выполняет два признака, место в, который, если у него не было например высоты 150, aparecer¦ - в единственную ширину = 300, подтверждая, что он не выполняет два обязательных условия.

А именно, функционирует 'наоборот'.

0
ответ дан 24.11.2019, 07:35
  1. В SQL нет формы, посредством queries, trasponer линии в колонны.
  2. , Если то, что ты желаешь, состоит в том, чтобы просачиваться по where , ты можешь решать это посредством следующей консультации:

    SELECT a.Id, a.descripcion, a.color, a2.nombre, a2.valor  
    FROM articulos AS a
    INNER JOIN atributos AS a2
        ON (a.Id = a2.Id_art)
    WHERE (a2.nombre = 'alto' and a2.valor = 150) or 
        (a2.nombre = 'ancho' and a2.valor = 300)
    

Результат это obtendr¦-схвати в линиях с признаками один под другим для каждой статьи. В случае когда ты нуждаешься в этом traspuesto, ты можешь приносить это в excel и использовать таблицу dinÃ: слюда. Привет.

НОВЫЙ ОТВЕТ , В случае когда тебе нужно, чтобы были выполнены оба условия с различными признаками, ты используешь subqueries:

SELECT a.Id, a.descripcion, a.color, a2.nombre, a2.valor  
FROM articulos AS a
INNER JOIN atributos AS a2
    ON (a.Id = a2.Id_art)
WHERE ( SELECT COUNT(*) 
        FROM atributos AS a3
        WHERE a.Id = a3.Id_art AND 
            a3.nombre = 'alto' AND 
            a3.valor = 150) >=1  AND 
      ( SELECT COUNT(*) 
        FROM atributos AS a3
        WHERE a.Id = a3.Id_art AND 
            a3.nombre = 'ancho' and 
           a3.valor = 300) >=1

Subqueries считают реестры, где выполняются твои условия в признаках, если они дают большему или равному 1 в каждом из них, он выполняет condici¦n, который ты ищешь.

0
ответ дан 24.11.2019, 07:35
  • 1
    Спасибо Rostan, но я это сделал, и проблема состоит в том, что консультация приносит статьи, которые выполняют одну или другое условие, а не оба в то же время. В любом случае, спасибо за ответ. – Marcelo R 11.07.2017, 20:17
  • 2
    Modifiqué ответ, я жду ты dirva. Привет. – Rostan 11.07.2017, 20:56

Ты нуждаешься в Двойной порции Join

  1. Te получает статьи, у которых есть высота в 150
  2. Из полученных статей, получает тех, у которых есть ширина в 300

    SELECT, ст. Пойдите, art.descripcion, art.color, a_alto.nombre, a_alto.valor
    FROM статьи СХВАТИ art INNER JOIN признаки ЭКСПЕРТ a_alto ON a_alto. Пойдите = ст. Id_art AND a_alto.nombre = 'высота' AND a_alto.valor = 150
    INNER JOIN признаки СХВАТИ a_ancho ON a_ancho. Пойдите = ст. Id_art AND a_ancho.nombre = 'ширина' AND a_ancho.valor = 300

0
ответ дан 24.11.2019, 07:35