Pregunta de pedido de la ejecución de la consulta de SQL para el grupo por y seleccione -- mysql campo con sql camp Relacionados El problema

sql query execution order question for group by and select


2
vote

problema

Español

La estructura de la tabla:

  create table t_hr_ship ( shipment_id int, shipper_id int, date_time date, pickup_state varchar(20), dropoff_state varchar(20));   

Aquí hay algunos datos en esta tabla:

  insert into t_hr_ship values (1, 1, "2018-01-01", "WA", "OR"), (2, 1, "2018-01-02", "WA", "OR"), (3, 1, "2018-01-03", "WA", "OR"), (4, 1, "2018-01-04", "WA", "OR"), (5, 2, "2018-01-05", "WA", "OR"), (6, 3, "2018-01-06", "WA", "OR"), (7, 2, "2018-02-01", "OR", "WA"), (8, 4, "2018-02-02", "OR", "WA"), (9, 3, "2018-02-03", "WA", "CA"), (10, 5, "2018-02-04", "CA", "OR"), (11, 2, "2018-03-05", "WA", "TX"), (12, 3, "2018-01-06", "OR", "CA");   

La pregunta es obtener las 3 mejores rutas más concurridas de enero y febrero. Tenga en cuenta que la ruta es la misma para "WA" a "o" y "o" a "WA" (el orden de dos puntos finales no importa siempre y cuando sean los mismos dos puertos finales). La solución es la siguiente:

  select case when s.pickup_state < s.dropoff_state then s.pickup_state else s.dropoff_state end as pickup,         case when s.pickup_state > s.dropoff_state then s.pickup_state else s.dropoff_state end as dropoff,        count(s.shipment_id) as no_of_shipment from t_hr_ship s where month(s.date_time) in ("01","02") group by pickup, dropoff order by no_of_shipment desc limit 3;   

Esto consigue lo que espero. Mi pregunta es: Leí por el recurso en línea que la orden de la ejecución de la consulta de SQL es 998877763 PickUp and DowOff defined in Seleccione can't be used in6 Grupo por`. ¿Estoy perdiendo algo?

Original en ingles

the table structure:

create table t_hr_ship ( shipment_id int, shipper_id int, date_time date, pickup_state varchar(20), dropoff_state varchar(20)); 

Here are some data in this table:

insert into t_hr_ship values (1, 1, "2018-01-01", "WA", "OR"), (2, 1, "2018-01-02", "WA", "OR"), (3, 1, "2018-01-03", "WA", "OR"), (4, 1, "2018-01-04", "WA", "OR"), (5, 2, "2018-01-05", "WA", "OR"), (6, 3, "2018-01-06", "WA", "OR"), (7, 2, "2018-02-01", "OR", "WA"), (8, 4, "2018-02-02", "OR", "WA"), (9, 3, "2018-02-03", "WA", "CA"), (10, 5, "2018-02-04", "CA", "OR"), (11, 2, "2018-03-05", "WA", "TX"), (12, 3, "2018-01-06", "OR", "CA"); 

the question is to get top 3 busiest routes in Jan and Feb. note that the route is same for "WA" to "OR" and "OR" to "WA" (the order of two end points don't matter as long as they are the same two end ports). the solution is as below:

select case when s.pickup_state < s.dropoff_state then s.pickup_state else s.dropoff_state end as pickup,         case when s.pickup_state > s.dropoff_state then s.pickup_state else s.dropoff_state end as dropoff,        count(s.shipment_id) as no_of_shipment from t_hr_ship s where month(s.date_time) in ("01","02") group by pickup, dropoff order by no_of_shipment desc limit 3; 

this does get what I expect. my question is: I read from online resource that the sql query execution order is from -> where -> group -> having -> select -> order by -> limit", if this is true than this solution should not work because thepickupanddropoffdefined inselectcan't be used ingroup by`. am I missing anything?

     
         
         

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Puede usar %n0 y %n1111 Para agrupar constantemente:

  %n2  

Tenga en cuenta que, a diferencia de otros RDBMS, MySQL permite el uso de alias de columna en la cláusula %n313 en la cláusula 014 , pero esto es común en la mayoría Rdms).

Demo en DB Fiddle :

 Pickup | DropOff | no_of_shipment : ----- | : ------ | -------------: O | Wa | 8 Ca | O | 2 Ca | Wa | 1 
 

You can use least() and greatest() to group by consistently:

select      least(pickup_state, dropoff_state) pickup,     greatest(pickup_state, dropoff_state) dropoff,     count(*) as no_of_shipment from t_hr_ship s where month(date_time) in (1, 2) group by pickup, dropoff order by no_of_shipment desc limit 3; 

Note that, unlike other RDBMS, MySQL allows the use of column aliases in the GROUP BY clause (and as well in the ORDER BY clause, but this is common in most RDMS).

Demo on DB Fiddle:

 pickup | dropoff | no_of_shipment :----- | :------ | -------------: OR     | WA      |              8 CA     | OR      |              2 CA     | WA      |              1 
 
 
0
 
vote

El orden de ejecución no está determinado por la consulta. SQL no es un lenguaje de procedimiento, es un idioma declarativo .

La instrucción %n515 describe el conjunto de resultados. De hecho, la ruta de ejecución definitiva puede tener poco parecido con la consulta real, aunque MYSQL no es tan sofisticada como otras bases de datos.

Qué es especificado es el orden de interpretar el significado de los alias de columna en la consulta. De eso es lo que te refieres.

Algunas bases de datos, como MySQL, relajan el estándar y permiten alias de columna en el %n6 . Es tan simple como eso.

 

Execution order is NOT determined by the query. SQL is not a procedural language, it is a declarative language.

The SELECT statement is describing the result set. In fact, the ultimate execution path may have little resemblance to the actual query -- although MySQL is not as sophisticated as other databases.

What is specified is the order for interpreting the meaning of column aliases in the query. That is what you are referring to.

Some databases, such as MySQL relax the standard and allow column aliases in the GROUP BY. It is as simple as that.

 
 

Relacionados problema

62  Cambie los valores de columna indexados únicos en la base de datos  ( Swap unique indexed column values in database ) 
Tengo una tabla de base de datos y uno de los campos (no la clave principal) está teniendo un índice único en él. Ahora quiero intercambiar valores debajo de ...

26  ¿Por qué la indexación de texto completo de SQL no tiene resultados de devolución de texto para las palabras que contienen #?  ( Why doesnt sql full text indexing return results for words containing ) 
Por ejemplo, mi consulta es como la siguiente utilizando SQL Server 2005: SELECT * FROM Table WHERE FREETEXT(SearchField, 'c#') Tengo un índice de tex...

125  ¿Hay un sistema de control de versiones para los cambios de la estructura de la base de datos?  ( Is there a version control system for database structure changes ) 
A menudo me encuentro con el siguiente problema. Trabajo en algunos cambios en un proyecto que requiere nuevas tablas o columnas en la base de datos. Hago l...

146  ¿Marque los cambios en una tabla de SQL Server?  ( Check for changes to an sql server table ) 
¿Cómo puedo monitorear una base de datos de SQL Server para cambios en una tabla sin usar desencadenantes o modificando la estructura de la base de datos de n...

126  Bases de datos de archivos planos [cerrados]  ( Flat file databases ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...

65  Decodificación T-SQL FUNCIONES EN C # / VB.NET  ( Decoding t sql cast in c vb net ) 
Recientemente, nuestro sitio ha sido desalentado con el resurgimiento de la asprox botnet inyección de SQL Ataque. Sin entrar en detalles, el ataque inten...

2520  ¿Cómo funciona la indexación de la base de datos? [cerrado]  ( How does database indexing work ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

43  Mapas de sitio ASP.NET  ( Asp net site maps ) 
¿Alguien tiene experiencia en la creación de proveedores de mapas de sitio ASP.NET basados ​​en SQL? Tengo el archivo XML predeterminado web.sitemap Traba...

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...

66  ¿Cómo indexo una columna de base de datos?  ( How do i index a database column ) 
Ojalá, puedo obtener respuestas para cada servidor de base de datos. Para un resumen de cómo se retira las obras de indexación: ¿Cómo funciona la indexació...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos