2010-02-03 15 views
5

EDITAR PARA ACLARAREspecificación de los récord para volver de una cláusula GROUP BY

probablemente estoy mal entendido el uso de GROUP BY así que voy a reformular mi pregunta sin hacer suposiciones sobre cómo resolver el problema:

I tienen una lista de term_id s y una tabla que contiene los objetos (que tienen un object_id PK y term_id como FK entre otros campos), necesito para extraer el objeto con el más alto object_id para cada term_id suministrado. ¿Cuál es la forma correcta de hacerlo?

pregunta original

Estoy seguro de que me falta algo obvio, pero no puedo encontrar la manera de especificar cuales expediente será devuelto por una consulta con un GROUP BY. De forma predeterminada, GROUP BY devuelve el primer registro del grupo, ¿quién puede obtener el último en su lugar sin utilizar una subconsulta?

consulta Basic devuelve primer registro:

SELECT * 
    FROM wp_term_relationships 
    WHERE term_taxonomy_id IN (20, 21, 22) 
    GROUP BY term_taxonomy_id 

esto funciona, pero con una subconsulta

SELECT * 
    FROM (
     SELECT * 
     FROM wp_term_relationships 
     WHERE term_taxonomy_id IN (20, 21, 22) 
     ORDER BY object_id DESC 
    ) wtt 
    GROUP BY term_taxonomy_id 

esto es un error de sintaxis

SELECT * 
    FROM wp_term_relationships 
    WHERE term_taxonomy_id IN (20, 21, 22) 
    ORDER BY object_id DESC 
    GROUP BY term_taxonomy_id 
+1

Mi cabeza TSQL duele al pensar en SELECCIONAR * con un GRUPO BY realmente trabajando – MartW

+0

Lo estoy posteando como un comentario s No soy un experto en esta área, pero mi primera reacción es que GROUP BY se trata del grupo de registros no específico. Si desea devolver la primera fila en un conjunto relacionado de registros, entonces TOP (1) y una cláusula WHERE apropiada parece más apropiada. Si desea devolver los datos recopilados de un grupo de filas, SUMA, AVG, COUNT, etc., utilice GROUP BY. Si me he perdido el punto de su consulta, por favor, elabore. – Lazarus

Respuesta

8

SELECT *... GROUP BY no se supone que funciona. El hecho de que su primer ejemplo funcione es una característica intrincada de MySQL.

Para que funcione GROUP BY, su cláusula SELECT no puede ser *. Tiene que ser una mezcla de las columnas GROUP BY y funciones "agregadas" como COUNT, SUM, etc.

SELECT COUNT(*), some_column FROM... GROUP BY some_column es la forma esperada.

No se espera que SELECT * funcione.

Desea encontrar el object_id más alto para cada term_id.

SELECT MAX(term_id), object_id FROM some_table GROUP BY object_id 

Algo así?

+0

+1 Sabía que algo sobre esa consulta olía mal. – Lazarus

+0

Gracias, ahora entiendo cómo utilizar GROUP BY, lo cual es malo por solo pasarme los documentos. Gracias por la solución también. –

0

GROUP BY se debe utilizar con las funciones de agregado como count, sum, avg etc. Tales como:

select product_name, sum(price) 
from product_sales 
group by product_name 
3

Ninguno de los ejemplos que ha publicado son T-SQL correcta. No puede SELECT * cuando usa una cláusula GROUP BY.

GROUP BY no devuelve el primer registro en el grupo - se agrega por las columnas especificadas en la cláusula (también existen las columnas que puede usar en su cláusula SELECT).

Necesita usar una función de agregado (como SUMA o COUNT o MAX) en su cláusula SELECT.No se especificó qué tipo de agregado que está tratando de conseguir, así que va a utilizar cuentan en mi ejemplo, para el número de registros:

SELECT COUNT(term_taxonomy_id) 
FROM wp_term_relationships 
WHERE term_taxonomy_id IN (20, 21, 22) 
GROUP BY term_taxonomy_id 
1

no quiero repetir lo que dicen las otras respuestas, pero me gustaría añadir un poco de información sobre la agrupación de SQL, que puede ayudar ...

pensar en el resultado de la consulta que se está construyendo en este orden:

dE & JOIN determinar & filas de filtro
DONDE filtros más en esas filas
GROUP BY combina esas filas en grupos (ahora una fila por cada grupo)
QUE TIENEN filtros grupos a nivel de grupo
ORDER BY arregla el resto de las filas/grupos

Cuestiones relacionadas