español - mysql wikipedia
mySQL selecciona una columna DISTINCT, con las otras columnas correspondientes (10)
ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
Quiero seleccionar resultados DISTINCT
de la columna FirstName
, pero necesito el ID
y el LastName
correspondientes.
El conjunto de resultados debe mostrar solo un John
, pero con un ID
de 1 y un LastName
de Doe.
La palabra clave DISTINCT
realmente no funciona de la manera en que lo espera. Cuando use SELECT DISTINCT col1, col2, col3
de hecho está seleccionando todas las tuplas {col1, col2, col3} únicas.
No estoy seguro si puede hacer esto con MySQL, pero puede usar un CTE en T-SQL
; WITH tmpPeople AS (
SELECT
DISTINCT(FirstName),
MIN(Id)
FROM People
)
SELECT
tP.Id,
tP.FirstName,
P.LastName
FROM tmpPeople tP
JOIN People P ON tP.Id = P.Id
De lo contrario, es posible que deba usar una tabla temporal.
Puede usar group by para visualizar valores distintos y también los campos correspondientes.
select * from tabel_name group by FirstName
Ahora obtuviste resultados como este:
ID FirstName LastName
2 Bugs Bunny
1 John Doe
Si quieres responder como
ID FirstName LastName
1 John Doe
2 Bugs Bunny
luego usa esta consulta,
select * from table_name group by FirstName order by ID
Tenga en cuenta que al usar el grupo por orden MySQL es la ÚNICA base de datos que permite usar columnas en el grupo y / o ordenarlas por partes que no son parte de la declaración de selección.
Entonces, por ejemplo: seleccione column1 del cuadro group by column2 order by column3
Eso no volará en otras bases de datos como Postgres, Oracle, MSSQL, etc. Tendría que hacer lo siguiente en esas bases de datos
seleccione column1, column2, column3 del grupo de tabla por columna2 ordena por column3
Solo información en caso de que alguna vez migre su código actual a otra base de datos o empiece a trabajar en otra base de datos e intente reutilizar el código.
prueba esta consulta
SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)
EDITAR
La respuesta original se escribió antes de MySQL 5.7.5 , que ya no se aplica debido a los cambios predeterminados con ONLY_FULL_GROUP_BY
. También es importante tener en cuenta que cuando ONLY_FULL_GROUP_BY
está deshabilitado, el uso de GROUP BY
sin una función agregada arrojará resultados inesperados, ya que MySQL puede elegir CUALQUIER valor dentro del conjunto de datos que se agrupe [sic] .
Suponiendo que el primer nombre y el apellido están indizados de forma exclusiva, una alternativa a GROUP BY
es ordenar usando un LEFT JOIN
para filtrar el conjunto de resultados. Ver demostración
Para recuperar el primer nombre distinto ordenado por apellido en orden descendente (ZA)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Para recuperar el primer nombre distinto ordenado por apellido en orden ascendente (AZ)
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
A continuación, puede solicitar los datos resultantes según lo desee.
Si la combinación de nombre y apellido no es única y tiene varias filas de los mismos valores, puede filtrar el conjunto de resultados incluyendo una condición O en la unión para elegir un ID específico. Ver la demostración
table_name data :
(1, ''John'', ''Doe''),
(2, ''Bugs'', ''Bunny''),
(3, ''John'', ''Johnson''),
(4, ''John'', ''Doe''),
(5, ''John'', ''Johnson'')
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
#Results
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
ADVERTENCIA
Con MySQL GROUP BY
no siempre se obtendrán los resultados esperados cuando se utiliza con ORDER BY
Ver: Ejemplo de caso de prueba .
El mejor método de implementación para garantizar los resultados esperados es filtrar el alcance del conjunto de resultados utilizando una subconsulta como esa.
table_name data :
(1, ''John'', ''Doe''),
(2, ''Bugs'', ''Bunny''),
(3, ''John'', ''Johnson'')
Consulta
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
#Results
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
Versus
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
#Results
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName
Sería la mejor opción IMO.
SELECT ID,LastName
From TABLE_NAME
GROUP BY FirstName
HAVING COUNT(*) >=1
SELECT firstName, ID, LastName from tableName GROUP BY firstName
select distinct (column1), column2
from table1
group by column1