tutorial español descargar definicion caracteristicas mysql

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