Foros del Web » Programando para Internet » ASP Clásico »

Sustituir Distinct

Estas en el tema de Sustituir Distinct en el foro de ASP Clásico en Foros del Web. Acabo de descubrir que al menos en MySQL el uso de DISTINCT deja bloqueado al servidor mas potente, cuando tenemos en una tabla más de ...
  #1 (permalink)  
Antiguo 06/01/2006, 11:36
 
Fecha de Ingreso: enero-2003
Ubicación: Madrid
Mensajes: 19
Antigüedad: 22 años, 3 meses
Puntos: 0
Sustituir Distinct

Acabo de descubrir que al menos en MySQL el uso de DISTINCT deja bloqueado al servidor mas potente, cuando tenemos en una tabla más de 50.000 registros un solo DISTINCT acaba con los recursos de cualquier server.
Asi que lo primero aprovecho para que lo sepais, y no os tireis semanas tratando de averiguar donde esta el error para que una aplicación se quede colgada.

Bien, ahora el tema es ¿Como sustituir este código por otro que no use el DITINCT?

SELECT DISTINCT user_name, email FROM Users, Disc_Forums, Disc_Topics, Disc_Replies WHERE ((Users.user_id=Disc_Replies.user_id AND Disc_Topics.TopicId=Disc_Replies.TopicId AND Disc_Replies.Notify=1) OR (Users.user_id=Disc_Topics.user_id AND Disc_Topics.Notify=1)) AND Disc_Topics.ForumId=Disc_Forums.ForumId AND Disc_Topics.TopicId=?


Desde ya muchas gracias a quien me responda.
  #2 (permalink)  
Antiguo 06/01/2006, 17:32
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Bueno, no solo el distinct esta mal en tu consulta, veo que formas un enoooorme producto cartesiano que bien pudieras evitar si usas inner join en lugar de las cláusulas and en el where.

Saludos
  #3 (permalink)  
Antiguo 08/01/2006, 15:00
 
Fecha de Ingreso: enero-2003
Ubicación: Madrid
Mensajes: 19
Antigüedad: 22 años, 3 meses
Puntos: 0
Estoy un poco "pez" en programación SQL ¿Podrías ayudarme con la forma de realizar esta consulta de la forma más óptima?

Gracias por tu ayuda!!
  #4 (permalink)  
Antiguo 09/01/2006, 19:18
 
Fecha de Ingreso: enero-2003
Ubicación: Madrid
Mensajes: 19
Antigüedad: 22 años, 3 meses
Puntos: 0
¿?¿?¿?¿?¿?¿?
  #5 (permalink)  
Antiguo 19/01/2006, 13:23
 
Fecha de Ingreso: enero-2003
Ubicación: Madrid
Mensajes: 19
Antigüedad: 22 años, 3 meses
Puntos: 0
Sos Sos Sos
  #6 (permalink)  
Antiguo 23/01/2006, 16:10
 
Fecha de Ingreso: enero-2003
Ubicación: Madrid
Mensajes: 19
Antigüedad: 22 años, 3 meses
Puntos: 0
SOS - SOS -SOS -SOS
Por favor, ayuda!!
  #7 (permalink)  
Antiguo 23/01/2006, 17:37
 
Fecha de Ingreso: noviembre-2005
Ubicación: venezulea
Mensajes: 214
Antigüedad: 19 años, 5 meses
Puntos: 0
me parece tambien que lo debes hacer con inner join dejame darte un ejemplo
  #8 (permalink)  
Antiguo 23/01/2006, 17:44
 
Fecha de Ingreso: noviembre-2005
Ubicación: venezulea
Mensajes: 214
Antigüedad: 19 años, 5 meses
Puntos: 0
Sintaxis

SELECT campos FROM tb1 INNER JOIN tb2 ON tb1.campo1 comp tb2.campo2


SELECT DISTINCT user_name, email FROM Users INNER JOIN Disc_Forums INNER JOIN Disc_Topics INNER JOIN Disc_Replies ON Users.Users.user_id = Disc_Forums.Disc_Replies.user_id ..... tb2.campo2

de esta manera solucionas lo segundo
  #9 (permalink)  
Antiguo 28/01/2006, 20:40
 
Fecha de Ingreso: enero-2003
Ubicación: Madrid
Mensajes: 19
Antigüedad: 22 años, 3 meses
Puntos: 0
Gracias Ostayde, he probado con esto después de investigar sobre el uso del INNER JOIN:

SELECT DISTINCT user_name, email FROM Users INNER JOIN Disc_Forums INNER JOIN Disc_Topics INNER JOIN Disc_Replies ON (Users.user_id = Disc_Replies.user_id AND ON Disc_Topics.TopicId=Disc_Replies.TopicId) AND Disc_Replies.Notify=1 OR ON (Users.user_id=Disc_Topics.user_id) AND Disc_Topics.Notify=1 AND ON (Disc_Topics.ForumId=Disc_Forums.ForumId) AND Disc_Topics.TopicId=?

Pero me dá error, llevo horas con esto y no soy capaz de hacerlo funcionar ¿Qué estoy haciendo mal?
  #10 (permalink)  
Antiguo 28/01/2006, 22:02
Avatar de tomchat  
Fecha de Ingreso: septiembre-2005
Mensajes: 231
Antigüedad: 19 años, 8 meses
Puntos: 0
PS trata de no usar el DISTINCT ya q forzas al manejador BD a analizar la estructura de las tablas a consultar, ya q cuentas con varios datos tambien no es mi optimo
  #11 (permalink)  
Antiguo 28/01/2006, 22:04
Avatar de tomchat  
Fecha de Ingreso: septiembre-2005
Mensajes: 231
Antigüedad: 19 años, 8 meses
Puntos: 0
A y la sintaxis de tu inner join esta mal rebiza bien los ON, sorry q no tengo tiempo.
  #12 (permalink)  
Antiguo 29/01/2006, 10:08
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 23 años, 3 meses
Puntos: 146
Aunque es bastante aconsejable que uno sepa armar una consulta "a pie", normalemente los "front-end" gráficos de las bases de datos tienen una utilería que con solo arrastar los campos que hacen las relaciones entre las tablas, van formando corectamente la consulta.

Por otro lado, excelente por haberlo investigado, partiendo de ahí, puedo decirte que tu consulta sería más o menos así:

Cita:
SELECT Users.user_name, Users.email
FROM ((Users INNER JOIN Disc_Replies ON Users.user_id = Disc_Replies.user_id) INNER JOIN Disc_Topics ON Disc_Replies.TopicId = Disc_Topics.TopicId) INNER JOIN Disc_Forums ON Disc_Topics.ForumId = Disc_Forums.ForumId
WHERE ((Disc_Replies.Notify="1") OR (Disc_Topics.Notify="1")) AND (Disc_Replies.TopicId=[?])
Revisa si agrupé bien los or's, así lo entendí según tu post original

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:22.