Luchando para escribir mi primera consulta de uniones

Tengo 3 tablas que he tratado de diseñar a continuación. Estoy más que atascado. No he hecho muchas consultas, nunca he hecho uniones antes y estoy realmente confundido sobre cómo hacer esto. Una consulta de ejemplo que tendría sería en inglés simple,

obtenga todos los ID_elementos_de_cartera de skill_area donde diseño_web="1", luego obtenga todas las filas de elementos_de_cartera con los valores de identificación de los ID_elementos_de_cartera y luego, para cada fila, obtenga la fila de las etiquetas donde ID_elemento_de cartera es igual a ID_de_elemento_de cartera y el valor de uno de Illustrator, photoshop o css es 1.

CONSULTA me las arreglé para llegar a


SELECCIONAR portfolio_item_id

DE habilidad_área s

DÓNDE diseño_web=1


SELECCIONAR *

DE portfolio_items p

DÓNDE p.id= s.portfolio_item_id


SELECCIONAR *

DE etiquetas t

DÓNDE s.portfolio_item_id=t.portfolio_item_id


así que creo que esto es correcto y solo tengo que unirlo ahora


Artículos de parque

id

nombre del árticulo

descripción

Área de habilidad

portfolio_item_id

diseñadores web

branding

Imprimir

Etiquetas

portfolio_item_id

ilustrador

photoshop

css

preguntado el 03 de mayo de 12 a las 17:05

Debe cambiar la parte 'y el valor = 1' porque eso es confuso. Prueba 'y el valor de uno de illustrator, photoshop o css es 1' -

4 Respuestas

Divídalo en pasos, como lo hizo en su declaración de "inglés simple":

  1. obtener web_design skill_area's

    select * from skill_area where web_design = '1'
    
  2. unirse con portfolio_items

    select * 
     from skill_area s, portfolio_items p 
     where web_design = '1' 
       and p.id = s.portfolio_item_id
    
  3. unirse con etiquetas, seleccionando la fila donde el valor = 1 y devolviendo solo las columnas de la tabla de etiquetas)

    select t.* 
     from skill_area s, portfolio_items p, tags t 
     where web_design = '1' 
       and p.id = s.portfolio_item_id
       and p.id = t.portfolio_item_id
       and t.value = '1'
    

contestado el 03 de mayo de 12 a las 17:05

Solo estoy leyendo esto tratando de seguir, ¡las instrucciones paso a paso lo hacen mucho más simple! Supongo que las letras son abreviaturas de las tablas. En el número 3, comienza select t., bueno, t no se ha definido en ninguna parte, entonces, ¿cómo sabe qué es? - Claro

sí, las letras son abreviaturas (se llaman alias). Mire un poco más de cerca... 't' es un alias para 'tags'. - Vinod Kurup

oh, ya veo, ¿entonces se puede definir más abajo en la consulta? Pensé que iba en el orden en que se dijo. - Claro

@VinodKurup ahh oh, lo llegué casi al final, el problema ahora es que confundí a la gente al decir valor = 1, lo que quise decir fue: recuperar todos los nombres de columna cuyo campo contiene 1 para ese portfolio_item_id - Claro

Hmmm ... no es tan fácil obtener 'nombres' de columna (a diferencia de valores) con consultas de base de datos simples. Use algo como la respuesta de @AngeloNeuschitzer, o realice ese paso después de obtener los resultados de la consulta. - Vinod Kurup

Prueba esto:

SELECT sa.portfolio_item_id, pi.*, subtags.*
FROM skill_area sa
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id
INNER JOIN (SELECT CASE WHEN illustrator = '1' THEN 'illustrator' 
                        WHEN photoshop = '1' THEN 'photoshop' 
                        ELSE 'css' END as tag, portfolio_item_id 
            FROM tags) subtags ON sa.portfolio_item_id = subtags.portfolio_item_id
WHERE sa.web_design = '1'

Comentó que desea tener una alternativa en la que solo obtenga todas las columnas de las etiquetas.

SELECT sa.portfolio_item_id, pi.*, tags.*
FROM skill_area sa
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id
INNER JOIN tags ON sa.portfolio_item_id = tags.portfolio_item_id
WHERE sa.web_design = '1'

contestado el 03 de mayo de 12 a las 20:05

¡gracias! También debo mencionar que necesito poder obtener el nombre de la columna donde el valor de las etiquetas es 1, ¿el resultado correspondiente contendrá los detalles del nombre de la columna? - Claro

Ya veo, entonces no quieres las tres columnas (que tienen valores 0,0,1) pero tienes el nombre de la columna... Solo un segundo lo arreglaré. - Ángelo Fuchs

no, quiero el nombre de la columna donde el valor = "1" como parte del resultado - Claro

Sí, pero eso no funciona tan fácilmente. Puede usar una estructura CASE WHEN (de una forma u otra, la forma en que la diseñé no es la 'mejor') para resolver eso. - Ángelo Fuchs

@Nicola No estoy seguro de cómo se ven sus datos reales, por lo que tal vez obtenga los resultados correctos al usar un LEFT JOIN para las subetiquetas. O bien, si tiene entradas en etiquetas donde no hay columnas con un '1', debe agregar ` WHERE illustrator = '1' OR photoshop = '1' OR css = '1'` después FROM tags - Ángelo Fuchs

SELECT      P.*
FROM        SkillArea S
INNER JOIN  Portfolio P ON S.portfolio_item_id = P.id
INNER JOIN  Tags T ON T.portfolio_item_id = P.id
WHERE       S.web_design = 1
AND         P.id = 1

contestado el 03 de mayo de 12 a las 17:05

No quería todo de S - Ángelo Fuchs

¡gracias! También debo mencionar que necesito poder obtener el nombre de la columna donde el valor de las etiquetas es 1, ¿el resultado correspondiente contendrá los detalles del nombre de la columna? - Claro

¿Tiene el Tags ¿La tabla tiene un campo de identificación? - weenoide

no, no pensé que lo necesitara, solo la identificación de portfolio_item - Claro

Así es como podría verse una consulta de este tipo. Traté de traducir de su variación en inglés palabra por palabra para ayudarlo a comprender, e incluí anotaciones para describir los pasos.

select s.portfolio_item_id, p.*, t.*
from Skill_Area s                                 -- get all portfolio_item_ids from skill_area
inner join Portfolio_Items p on                   -- then get all the rows from portfolio_items
    p.portfolio_item_ids = s.portfolio_item_ids   -- with the id values of portfolio_item_ids
inner join Tags t on                              -- then for each row, get the row from tags
    t.portfolio_item_id = p.portfolio_item_id     -- where portfolio_item_id is equal to portfolio_item_id
    and t.portfolio_item_id = 1                   -- and the value of it is 1
where s.web_design = "1"                          -- where web_design = "1"

contestado el 03 de mayo de 12 a las 17:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.