consulta SQL elaborada, el limitador de conteo (*) no funciona

Me temo que no soy muy bueno con SQL, así que no me sorprende tener problemas con esto, pero si pudiera ayudarme a hacerlo funcionar (ni siquiera tiene que ser una consulta), yo estaría agradecido. tratando de analizar algunos datos de Twitter usando MySQLdb en Python, estoy ejecutando:

for u_id in list:
"
select e.user_id
from table_entities e
inner join table_tweets t on e.id = t.id
where e.type='mention' and t.user_id=%s
group by e.type having count('hashtag') < 3
"
%
(u_id)

(la sintaxis de Python se falsificó ligeramente para no mostrar las cosas sin importancia)

ahora, todo antes de la instrucción "agrupar por" funciona bien. Puedo extraer user_ids mencionados en un tweet dado (id es el PK para table_tweets, mientras que hay otra fila en table_entities para cada mención, hashtag o URL) que coincide con la posición actual de mi bucle.

sin embargo, y no creo que lo esté formateando correctamente, el grupo por declaración no hace nada. lo que quiero hacer es excluir todos los ID de usuario que pertenecen a tweets (ID) que tienen 3 o más entradas en table_entity con type=hashtag. Puedo decir que no va a funcionar tal como está, ya que en realidad no se refiere a la columna de identificación, pero de cualquier manera que haya intentado hacer eso (por ejemplo, tratando de hacerlo parte de la cláusula de unión) arroja un error de sintaxis.

se agradece el consejo!

preguntado el 12 de junio de 12 a las 22:06

Puede ser un simple descuido, pero parece que no estás contando nada (o, más técnicamente, estás contando 'hashtag'. Lo que quiero decir es que tal vez deberías contar la columna hashtag y no la cadena 'hashtag'. -

Además, asegúrese de limpiar su código para usar parámetros y no sustitución de cadenas:

No importa, veo lo que estás tratando de hacer. -

Desafortunadamente, lo que está pidiendo y lo que muestra su código de ejemplo son antítesis. Su consulta extraerá todos los ID de usuario que tengan menos de 3 hashtags. Además, existe la realidad de que un usuario puede tener varios tweets, algunos con más de 3 hashtags y otros con menos. Obtendrá la identificación de usuario de este usuario debido a aquellos que tienen> 3 hashtags. Probablemente quieras obtener el Tweet id y luego averiguar quién era el usuario. -

@ConradFrix Si te refieres a mi primer comentario, entonces fue cuando todavía estaba trabajando en el problema de la palabra. En mi experiencia, HAVING COUNT('hashtags') < 3 evaluaría a 1 < 3 cual es TRUE. Por lo tanto, en realidad no está haciendo nada... a menos que MySQL haga algo de vudú con GROUP BY ... HAVING -

2 Respuestas

Esto realmente no hace lo que quieres.

select e.user_id
from table_entities e
inner join table_tweets t on e.id = t.id
where e.type='mention' and t.user_id=%s
group by e.type having count('hashtag') < 3
  • La cláusula Seleccionar y agrupar por no está haciendo lo que esperaba. Poniendo e.user_id en la cláusula SELECT y no en GROUP BY MySQL seleccionará un user_id arbitrario para cada e.type.
  • Having count('literalString') es el equivalente de Having COUNT(*) puede verlo usted mismo moviendo Count('hashtag') a la cláusula de selección.

Aquí hay una Demo en vivo de estos puntos

El resultado es que su consulta solo registrará si hay menos de 3 menciones para el usuario.

Hay muchas formas de lograr lo que está intentando. Elegí IN (también puede usar Exists o INNER JOIN para una subconsulta)

SELECT e.user_id 
FROM   table_entities e 
       INNER JOIN table_tweets t 
               ON e.id = t.id 
WHERE  e.type = 'mentions' 
       AND t.user_id =% s 
       AND e.user_ID  IN (SELECT e.user_id 
                             FROM   table_entities e 
                                    INNER JOIN table_tweets t 
                                            ON e.id = t.id 
                             WHERE  e.type = 'hashtag' 
                                    AND t.user_id =% s 
                             GROUP  BY e.user_id 
                             HAVING Count(*) >= 3) 

la subselección encuentra todos los ID de usuario que tienen menos de 3 registros en table_enties que tienen un e.type de "hashtag" y el usuario que coincide % s

El filtro de selección principal para 'menciones' y la identificación del usuario nuevamente. Esto le permite seleccionar un tipo de correo electrónico y filtrar según el conteo de otro tipo de correo electrónico.

Respondido el 12 de junio de 12 a las 23:06

Creo que quieres decir NOT IN or HAVING Count(*) >= 3 - fanfarrón

Me tomó cerca de 10 veces leerlo para descubrir lo que se necesita. - fanfarrón

Creo que analizó mal una parte de mi publicación (mi culpa es un poco confusa): la columna user_id solo se completa cuando type='mention'. Estoy tratando de limitar por el id columna. dicho esto, ¡pude hacerlo funcionar gracias a su ayuda!

select e.user_id
from table_entities e
inner join table_tweets t on e.id = t.id
where e.type='mention' and
e.id in
(select e.id
from table_entities e
where e.type='hashtag' group by e.id having count(*) < 3)

Decidí mover esto por encima del bucle for u_id in list porque la consulta ahora tarda un tiempo en ejecutarse, pero puedo trabajar con la salida de la lista aquí sin problemas. ¡Gracias!

Respondido el 13 de junio de 12 a las 16:06

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