SQL - Duda self join

 
Vista:
Imágen de perfil de Walter M

Duda self join

Publicado por Walter M (4 intervenciones) el 17/05/2013 02:08:23
Que tal gente! Buenas noches, es mi primera pregunta en este foro la verdad estoy retomando mis estudios de sql y estoy bastante perdido... Mi consulta es simple de explicar, usando la base de datos pubs que se descarga de la pagina tengo que realizar una consulta que diga:
"Mostrar los codigos de libros que tengan el mismo precio."
En su momento me dijeron que se hacía con un self join pero probé varias cosas y la verdad no me salió. Agradecería mucho que me pudieran orientar al respecto.
Para el que no tiene la base pubs les dejo un mini diagrama de la tabla.
El nombre de la tabla es titles y los campos importantes en si serian title_id, title y price.
Gracias de antemano =)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda self join

Publicado por xve (284 intervenciones) el 17/05/2013 07:59:58
Hola Walter, no nos muestras la consulta que realizas, pero la sintaxis básica de SELF JOIN seria algo así:
1
2
3
SELECT a.column_name, b.column_name...
FROM table1 a, table1 b
WHERE a.common_filed = b.common_field;

De todas maneras, te recomiendo utilizas [LEFT|RIGHT] JOIN ... ON ...

Si nos puedes mostrar tu consulta y el error que te da...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Walter M

Duda self join

Publicado por Walter M (4 intervenciones) el 17/05/2013 18:50:09
Si quizás estuve un poco flojo ahí je, gracias por responder, te muestro más o menos por donde va.
Si yo hago un:
1
2
3
4
5
SELECT		title,
			title_id,
			price
FROM		titles
ORDER BY	price

El resultado es:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
title                                                                            title_id price
-------------------------------------------------------------------------------- -------- ---------------------
The Psychology of Computer Cooking                                               MC3026   NULL
Net Etiquette                                                                    PC9999   NULL
The Gourmet Microwave                                                            MC3021   2,99
You Can Combat Computer Stress!                                                  BU2075   2,99
Life Without Fear                                                                PS2106   7,00
Emotional Security: A New Algorithm                                              PS7777   7,99
Is Anger the Enemy?                                                              PS2091   10,95
Fifty Years in Buckingham Palace Kitchens                                        TC4203   11,95
Cooking with Computers: Surreptitious Balance Sheets                             BU1111   11,95
Sushi, Anyone?                                                                   TC7777   14,99
Prolonged Data Deprivation: Four Case Studies                                    PS3333   19,99
The Busy Executive's Database Guide                                              BU1032   19,99
Straight Talk About Computers                                                    BU7832   19,99
Silicon Valley Gastronomic Treats                                                MC2222   19,99
Secrets of Silicon Valley                                                        PC8888   20,00
Onions, Leeks, and Garlic: Cooking Secrets of the Mediterranean                  TC3218   20,95
Computer Phobic AND Non-Phobic Individuals: Behavior Variations                  PS1372   21,59
But Is It User Friendly?                                                         PC1035   22,95

Y luego de la consulta que yo tengo que hacer el resultado debería ser:
1
2
3
4
5
6
7
8
9
title_id	price
MC3021	       2,99
BU2075	       2,99
TC4203           11,95
BU1111          11,95
PS3333           19,99
BU1032	       19,99
BU7832	       19,99
MC2222	       19,99

Es decir, solo muestra aquellos resultados que tienen un par, yo hice un:
1
2
3
4
5
6
7
8
9
select		count(t1.price) cuenta,
			t1.price
from		titles t1
left join	titles t2
on			t1.title_id=t2.title_id
where		t1.price=t2.price
group by	t1.price
having		COUNT(t1.price)>1
order by	price

Y el resultado me da bien, me sale
1
2
3
4
cuenta	price
2	2,99
2	11,95
4	19,99

Pero yo tambien necesito mostrar los códigos de los libros y la verdad ahí ya me hago lío.
Probé agregando algunos datos y me salió este:
1
2
3
4
5
6
7
8
9
10
11
select		t1.price,
			t1.title_id,
			count(t1.price)
from		titles t1
left join	titles t2
on			t1.title_id=t2.title_id
where		t1.price=t2.price
group by	t1.price,
			t1.title_id
having		COUNT(t1.price)>1
order by	price

En el cual agregué el campo title_id para que me muestre los códigos los libros pero el resultado me da blanco porque al estar separados por title_id el valor del count es 1 y ya no se que hacer =P
Una vez más gracias y espero tu respuesta =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda self join

Publicado por leonardo_josue (1173 intervenciones) el 17/05/2013 19:19:09
Hola Walter... existen muchas formas de llegar al resultado que quieres, pero en realidad creo que estás complicando demasiado al hacer COUNT's y agrupaciones ... la consulta puede quedar tan simple como hacer esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> SELECT T1.* FROM titles T1
    -> WHERE EXISTS (SELECT *
    ->               FROM titles T2
    ->               WHERE T1.price = T2.price AND
    ->                     T1.title_id != T2.title_id);
+------------------------------------------------------+----------+-------+
| title                                                | title_id | price |
+------------------------------------------------------+----------+-------+
| The Gourmet Microwave                                | MC3021   |  2.99 |
| You Can Combat Computer Stress!                      | BU2075   |  2.99 |
| Fifty Years in Buckingham Palace Kitchens            | TC4203   | 11.95 |
| Cooking with Computers: Surreptitious Balance Sheets | BU1111   | 11.95 |
| Prolonged Data Deprivation: Four Case Studies        | PS3333   | 19.99 |
| The Busy Executive's Database Guide                  | BU1032   | 19.99 |
| Straight Talk About Computers                        | BU7832   | 19.99 |
| Silicon Valley Gastronomic Treats                    | MC2222   | 19.99 |
+------------------------------------------------------+----------+-------+
8 rows in set (0.00 sec)


Es decir, simplemente verificar que exista un registro con el mismo precio, pero con distinto título.

Dale un vistazo y espero que te sirva.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Walter M

Duda self join

Publicado por Walter M (4 intervenciones) el 17/05/2013 19:23:26
Gracias!! Igual ahora que lo pienso ya que no lo aclaré es que el punto en sí me pedía usar una sentencia con Join, pero sí se que es como vos decís, y es que hay muchas maneras de hacer una consulta y llegar al mismo resultado. De todas formas muchas gracias! Aún me falta practicar
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Duda self join

Publicado por leonardo_josue (1173 intervenciones) el 17/05/2013 20:37:52
Hola de nuevo...

Como te dije, hay muchas maneras de llegar al mismo resultado... Si te piden hacerlo con JOIN's, igual, puedes hacerlo de muchas maneras, una sería así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT DISTINCT T1.* FROM titles T1
    -> INNER JOIN titles T2 ON T1.price = T2.price AND
    ->                         T1.title_id != T2.title_id;
+------------------------------------------------------+----------+-------+
| title                                                | title_id | price |
+------------------------------------------------------+----------+-------+
| You Can Combat Computer Stress!                      | BU2075   |  2.99 |
| The Gourmet Microwave                                | MC3021   |  2.99 |
| Cooking with Computers: Surreptitious Balance Sheets | BU1111   | 11.95 |
| Fifty Years in Buckingham Palace Kitchens            | TC4203   | 11.95 |
| The Busy Executive's Database Guide                  | BU1032   | 19.99 |
| Straight Talk About Computers                        | BU7832   | 19.99 |
| Silicon Valley Gastronomic Treats                    | MC2222   | 19.99 |
| Prolonged Data Deprivation: Four Case Studies        | PS3333   | 19.99 |
+------------------------------------------------------+----------+-------+
8 rows in set (0.03 sec)


Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar