Ejemplos de consultas de unión izquierda de SQL. MySQL JOIN: descripción, ejemplo de uso del comando y recomendaciones

Última actualización: 1.11.2015

Una de las principales formas en que un sitio web transmite datos es mediante el procesamiento de formularios. Las formas representan elementos especiales Marcado HTML que contiene varios elementos aporte - campos de texto, botones, etc Y con la ayuda de estos formularios podemos ingresar algunos datos y enviarlos al servidor. Y el servidor ya está procesando estos datos.

La creación de formularios consta de los siguientes aspectos:

    Crear un elemento en el marcado HTML

    Agregue uno o más campos de entrada a este elemento

    Configuración del método de transferencia de datos: GET o POST

    Configuración de la dirección a la que se enviarán los datos introducidos

Entonces vamos a crear nuevo uniforme. Para ello definimos nuevo archivo form.php, en el cual colocaremos el siguiente contenido:

Iniciar sesión en el sitio Iniciar sesión:

Contraseña:

Atributo acción="login.php" elemento de formulario indica que los datos del formulario serán procesados ​​por el script iniciar sesión.php, que se ubicará con el archivo formulario.php en una carpeta. Y el atributo método="POST" indica que el método POST se utilizará como método de transferencia de datos.

Ahora creemos un archivo. iniciar sesión.php, que tendrá el siguiente contenido:

Para obtener los datos del formulario, se utiliza la variable global $_POST. ella representa matriz asociativa datos transferidos mediante el método POST. Usando las claves podemos obtener los valores enviados. Las claves de esta matriz son los valores de los atributos de nombre de los campos de entrada del formulario.

Porque atributo de nombre el campo de entrada de inicio de sesión tiene el valor login(), luego en la matriz $_POST el valor de este campo representará la clave de "iniciar sesión": $_POST["login"]

Y dado que puede haber situaciones en las que el campo de entrada no se configurará, por ejemplo, al acceder directamente al script: http://localhost:8080/login.php. En este caso, es recomendable comprobar la disponibilidad de los datos utilizando la función isset() antes de procesarlos. Y si la variable está configurada, entonces la función isset() devolverá verdadero.

Ahora podemos acceder al formulario:

Y con solo hacer clic en un botón, los datos ingresados método de publicación será enviado al guión iniciar sesión.php:

No es necesario enviar los datos del formulario a otro script; puede procesar los datos del formulario en el mismo archivo de formulario. Para hacer esto, cambiemos el archivo. formulario.php como sigue:

Iniciar sesión en el sitio Iniciar sesión:

Contraseña:

Seguridad de datos

La seguridad de los datos es de gran importancia en PHP. Veamos algunos mecanismos simples que pueden mejorar la seguridad de nuestro sitio web.

Pero primero, tomemos el formulario del tema anterior e intentemos ingresar algunos datos en él. Por ejemplo, ingresemos "alerta (hola);" en el campo de inicio de sesión y "contraseña" en el campo de contraseña:

Después de enviar los datos a marcado html voluntad código implementado javascript que muestra un cuadro de mensaje.

para evitar problemas similares Para estar seguro, debes usar la función htmlentities():

If(isset($_POST["iniciar sesión"]) && isset($_POST["contraseña"]))( $iniciar sesión=htmlentities($_POST["iniciar sesión"]); $contraseña = htmlentities($_POST["contraseña" ]); echo "Su inicio de sesión: $iniciar sesión
Su contraseña: $contraseña"; )

E incluso después de entrar código html o javascript, se escaparán todas las etiquetas y obtendremos el siguiente resultado:

Otra función: la función strip_tags() le permite excluir completamente las etiquetas html:

If(isset($_POST["iniciar sesión"]) && isset($_POST["contraseña"]))( $iniciar sesión=strip_tags($_POST["iniciar sesión"]); $contraseña = strip_tags($_POST["contraseña" ]); echo "Su inicio de sesión: $iniciar sesión
Su contraseña: $contraseña"; )

El resultado de su operación con la misma entrada será la siguiente salida.

Además de lo habitual consultas simples Con condiciones simples lenguaje SQL te permite hacer bastante expresiones complejas, cuyas horcas a veces dan miedo a la vista, parecen tan incomprensibles. Sin embargo, este tipo de consultas no ocurren con mucha frecuencia y, en mi opinión, el siguiente nivel de complejidad después del SELECT habitual es el comando JOIN. Averigüemos cómo trabajar con él.

Primero, veamos las consultas más simples que se utilizan con frecuencia.

SELECCIONE CONTAR(*) DE la tabla; //cuenta el número de registros SELECT * FROM table LIMIT 5,10; //a partir de la quinta entrada se seleccionarán 10 filas. se utiliza con mayor frecuencia para la navegación de páginas SELECT * FROM table ORDER BY num; //ordena todos los registros de la tabla por número de campo SELECT * FROM table WHERE año="1990"; //seleccione el registro/registros donde el valor del año es 1990 SELECT * FROM table WHERE name LIKE "%ova%"; //busca en la tabla un nombre que contenga la secuencia "ova" SELECT DISTINCT name FROM table; //si hay campos duplicados, se contarán solo una vez SELECT * FROM nombre WHERE edad IN (12,15,18); // mostrará los nombres que corresponden a los campos con edades 12,15,18 SELECT MAX(age) FROM table; //MAX/MIN - selecciona la entrada con el máximo o valor mínimo edad

Ahora pasemos directamente a los ejemplos de JOIN:

Una tarea muy popular donde se utiliza el comando JOIN es unir varias tablas que tengan algún tipo de característica común. Veamos un ejemplo. Digamos que tenemos dos mesas. El primero almacena datos sobre el nombre y la dirección del usuario y también tiene una columna user_id. En la segunda columna también tenemos una columna user_id y una columna con el índice de inicio del usuario.

SELECCIONE nombre, dirección DE la tabla1 IZQUIERDA UNIRSE a la tabla2 EN table1.user_id=table2.user_id;

Para que quede aún más claro, esta consulta se puede reescribir de forma clásica:

SELECCIONE tabla1.nombre, tabla1.dirección, tabla2.índice DE tabla1, tabla2 DONDE tabla1.user_id = table2.user_id;

De esta manera puedes obtener datos de varias tablas, y si hay una condición adicional, la agregaremos también:

SELECCIONE nombre, dirección DE la tabla1 IZQUIERDA UNIRSE a la tabla2 EN table1.user_id=table2.user_id DONDE nombre = "Vasya";

Si nos sumergimos en la teoría, agregaremos que existen las siguientes opciones UNIRSE:

Sería apropiado dibujar aquí los famosos círculos:

UNIÓN INTERNA

devuelve la intersección de dos conjuntos

SELECCIONE t1.nombre, t2.ciudad DE Tabla1 t1 UNIÓN INTERNA Tabla2 t2 EN t1.key2 = t2.key2;

El reflejo de INNER JOIN es OUTER JOIN. Contamos con tres tipos de UNIÓN EXTERNA: COMPLETA, IZQUIERDA y DERECHA. La palabra EXTERIOR no es obligatoria.

ÚNETE COMPLETO

Combina dos conjuntos

FULL JOIN devolverá TODOS los registros de las tablas table y table2, sin datos duplicados. Cuando no haya datos, se sustituirá NULL.

UNIRSE A LA IZQUIERDA

Devuelve datos de la tabla de la izquierda, así como datos de la derecha que se cruzan con la izquierda.

Si no hay suficientes datos de la tabla derecha, se sustituirá por un valor NULL.

UNIÓN DERECHA: como probablemente comprenderá, devolverá todos los valores de la tabla derecha y los datos que se cruzan desde la izquierda.

Excepciones

Si necesitamos datos de la primera tabla para la cual no hay datos en la correcta, entonces solo necesitamos agregar una cláusula WHERE

SELECCIONE t1.nombre, t2.ciudad DE Tabla1 t1 UNIRSE A LA IZQUIERDA Tabla2 t2 EN t1.key2 = t2.key2 DONDE t2.key2 ES NULO;

Múltiples UNIONES

Usando JOIN puedes unir no solo 2 mesas, sino tantas como sea necesario. Si necesitas unir 2 mesas, necesitarás 2 UNIRSE a comandos. Pero no debes ir al extremo y unir un montón de tablas, todo esto tendrá un impacto significativo en el rendimiento, por lo que a veces es mejor ejecutar varias subconsultas. Ejemplo de unión de tres mesas:

SELECCIONE t1.Nombre, t2.Ciudad, t3.Profesión DESDE Tabla1 t1 UNIÓN INTERNA Tabla2 t2 ON t1.key2 = t2.key2 UNIÓN INTERNA Tabla3 t3 ON t1.key3 = t3.key3;

Bueno, espero que los sencillos ejemplos de JOIN enumerados te hayan ayudado a comprender este operador.

Aunque también se puede aplicar al desarrollo de normas productos de software, Para uso local. Pero esto no es de lo que hablará este artículo.

A menudo, cuando se trabaja con bases de datos en cada idioma, la tarea consiste en hacer una selección de datos para mostrarlos en varios informes, gráficos, etc. Como regla general, al implementar este tipo de tarea, es necesario utilizar no una, sino varias tablas, combinándolas en una sola consulta, lo que complica significativamente su diseño. En este caso, es necesario tener en cuenta cómo se generarán los datos, cómo se “levantarán” las tablas y qué resultado será el más aceptable para el programador. Para resolver tales problemas, se utiliza uno de los diseños estándar. lenguaje MySQL- Unirse.

Concepto de la palabra unirse

Los lenguajes de desarrollo de bases de datos, sin importar qué tipo de lenguaje sea, se basan en palabras estándar de diccionarios de inglés (razón por la cual, siempre que sepa idioma en Inglés, te resultará mucho más fácil trabajar con tablas). Para implementar la conexión de tablas a la selección, se utiliza la misma palabra: unirse. El lenguaje de programación de bases de datos utiliza My SQL. La traducción de esta palabra funcional es exactamente la misma que en el propio idioma: "unificación".

La interpretación de la construcción MySQL - Join, y cualquiera de ellas, será exactamente la misma. Si desciframos el propósito de la construcción, es decir, el esquema de su funcionamiento, obtenemos el siguiente significado: las construcciones nos permitirán recolectar los campos necesarios de diferentes mesas o consultas anidadas en una selección.

Tipos de estructuras para combinar.

Si un programador necesita recopilar una muestra de varias tablas y sabe qué campos clave hay en ellas y qué datos se necesitan para el informe, entonces puede utilizar una de las construcciones de unión principales para lograr el resultado deseado. Hay cuatro construcciones principales (para unir mesas):

  • Unión interna.
  • Unión cruzada.
  • Unión izquierda.
  • Únase a la derecha.
  • Dependiendo de la tarea en cuestión, cada uno de los diseños estándar dará diferentes resultados, que le permitirá recibir informes sobre diferentes parámetros en breve.

    Crear y completar tablas para su uso posterior.

    Antes de comenzar, por ejemplo, a considerar los mecanismos para trabajar con construcciones de agregación de datos, vale la pena preparar varias tablas con las que trabajaremos en el futuro. Esto ayudará a mostrar claramente todos los principios de funcionamiento de los operadores, además, de esta forma, los principiantes aprenderán más fácilmente todos los conceptos básicos de la programación de tablas.

    La primera tabla describirá algunos objetos con los que una persona se encuentra constantemente a lo largo de su vida.

    En la segunda tabla describimos algunas propiedades de los objetos de la primera tabla para que puedas trabajar con ellos en el futuro.

    En general, dos tablas serán suficientes para mostrar cómo funcionan con un ejemplo. Ahora podemos comenzar un examen práctico de nuestros diseños.

    Usando unión interna

    Al utilizar la construcción MySQL - Join Ineer, vale la pena considerar algunas de sus características. Este diseño le permitirá seleccionar de ambas tablas solo aquellos registros que se encuentran tanto en la primera como en la segunda tabla. ¿Cómo funciona esto? En la primera tabla tenemos llave maestra- ID, que indica el número de serie de los registros de la tabla.

    Al crear una segunda tabla, se utiliza la misma clave como número de secuencia; se puede ver un ejemplo en las imágenes. Al seleccionar datos, el operador Seleccionar dará como resultado solo aquellos registros que números de serie que coinciden, es decir, que están tanto en la primera como en la segunda tabla.

    Al utilizar el diseño, es necesario comprender exactamente qué datos necesita obtener. El error más común, especialmente para un programador novato, es irracional y mal uso Diseños de unión interna. ¿Cómo podemos considerar un script que nos devuelva información sobre los objetos y sus propiedades a partir de tablas previamente descritas y completadas? Pero aquí puede haber varias formas de utilizar la estructura. En este sentido, My SQL es un lenguaje muy flexible. Entonces, podemos mirar ejemplos. usando mysql Unión interna.

    Combinar tablas sin especificar ningún parámetro. En este caso obtendremos el siguiente resultado:

    Si indicamos vía palabra funcional Teniendo en cuenta que es necesario tener en cuenta las claves principales de los registros en las tablas, el resultado de la selección cambiará drásticamente. En este caso, obtendremos una selección que devolverá sólo aquellas filas que tengan las mismas claves primarias.

    También es posible una tercera opción para utilizar la construcción, cuando la consulta utiliza la palabra "on" para indicar los campos mediante los cuales se deben fusionar las tablas. En este caso, la selección devolverá los siguientes datos:

    Características del uso de Unión izquierda

    Si consideramos otra forma de unir tablas usando la construcción MySQL: Unirse, notará una diferencia en los datos que se generan. Semejante mecanismo es la construcción de la izquierda.

    El uso de la construcción MySQL Left Join tiene algunas peculiaridades y, al igual que Inner, requiere una comprensión clara del resultado que se debe obtener.

    EN en este caso Primero, se seleccionarán todos los registros de la primera tabla y luego se les agregarán los registros de la segunda tabla de propiedades. Además, si la primera tabla tiene un registro, por ejemplo, "taburete", y la segunda tabla no tiene una sola propiedad para él, entonces el operador Izquierda generará frente a este registro. valor nulo, que le dice al programador que no hay señales para este tipo de elemento.

    El uso de este diseño le permitirá determinar qué campos o, por ejemplo, los productos de una tienda no tienen precio, etc.

    Ejemplo de la izquierda

    Para considerar el operador de construcción MySQL Left Join en la práctica, utilizamos las tablas descritas anteriormente. Digamos que necesitas seleccionar la lista completa de productos que hay en la tienda y comprobar cuáles de ellos no tienen características ni propiedades. En este caso, la selección mostrará todos los productos, y aquellos que no tengan propiedad tendrán valores vacíos.

    Usar Where en una cláusula de unión

    Como parámetro, una unión puede incluir no sólo indicaciones de los campos mediante los cuales las tablas deben conectarse, sino que también puede incluir un operador de condición Where.

    Por ejemplo, considere un script que debería devolvernos solo aquellos registros para los cuales no se especifica el atributo. En este caso, debe agregar un operador de condición a la construcción Join e indicar qué se debe devolver exactamente como resultado.

    Al utilizar Join - Where en MySQL, debe comprender claramente que solo se mostrarán aquellos registros a los que se aplica la condición especificada, y la selección se verá así:

    Estas consultas le permiten realizar selecciones basadas en datos específicos relacionados con la condición seleccionada por el programador. Puede especificar varias de estas condiciones, mientras maximiza los parámetros para seleccionar datos de las tablas fusionadas.

    Usar Join para cambiar datos en tablas

    La construcción Join es esencialmente universal. Le permite no solo realizar varias selecciones, sino también conectar de una a varias tablas a consultas, ingrese condiciones adicionales a la muestra. La construcción también se puede utilizar para otras operaciones de datos. Por lo tanto, Join se puede utilizar para cambiar datos en una tabla. O mejor dicho, para aclarar las condiciones de la tabla o en los casos en los que sea necesario actualizar datos en varias tablas según las mismas condiciones.

    Por ejemplo, considere el siguiente problema. Se dan tres tablas que contienen algunos datos. Debe cambiar los datos en ambas tablas mediante una consulta. Es precisamente para resolver este tipo de tarea que puede utilizar la construcción Unir en el comando Actualizar. El tipo de construcción Join en sí depende, al igual que en el caso del muestreo de datos, del resultado que el programador quiere obtener.

    Veamos el ejemplo más simple. Debe actualizar los datos utilizando las mismas condiciones con una sola solicitud. Este tipo de consultas están diseñadas para optimizar el trabajo con la base de datos. ¿Por qué escribir consultas diferentes para cada tabla si puede realizar todas las manipulaciones de datos con una sola consulta? El ejemplo de unión en nuestro caso será así:

    Creación de consultas complejas

    Muy a menudo, cuando se trabaja con una base de datos, es necesario crear consultas no solo uniendo varias tablas, sino también utilizando subconsultas. Estas tareas son bastante difíciles de entender para un programador de bases de datos novato. La dificultad es que hay que pensar en cada paso, determinar qué datos se deben obtener de qué tabla o consulta y cómo deberá trabajar con ellos en el futuro.

    Para una comprensión más específica, puede considerar (en MySQL Join) ejemplos de consultas complejas. Si es un principiante y recién comienza a trabajar con bases de datos, dicha capacitación solo será beneficiosa. La opción ideal sería

    Esta consulta devolverá 58 registros de acuerdos de ventas para los cuales se ha completado o existe un saldo. dinero en la fecha seleccionada. En este caso es fecha actual. También se ha añadido la condición a la selección de que el nombre del contrato debe contener los símbolos “123”. La información (datos) que se muestra en la pantalla se ordenará por número de contrato.

    El siguiente ejemplo mostrará datos sobre todos los pagos, que indicarán el número de contrato.

    Usando subconsultas

    Como se mencionó anteriormente, cuando trabaja con bases de datos, puede unir no solo tablas, sino también una tabla con una consulta. Este diseño se utiliza principalmente para acelerar la consulta y optimizarla.

    Por ejemplo, si necesita seleccionar sólo dos campos de una tabla que tiene varios cientos de campos y, digamos, mil registros, entonces debería utilizar una consulta que devuelva sólo campos obligatorios y combinarlo con la muestra de datos principal. Como ejemplo de MySQL Join Select, puede considerar una consulta de este tipo:

    Estas no son todas las formas de utilizar construcciones estándar de MySQL, solo las estándar. Cómo utilizar la construcción Join y en qué tipos es decisión del programador, pero conviene recordar y tener en cuenta qué tipo de resultado se debe obtener al ejecutar la consulta.

    El motivo de escribir este artículo fue algún debate en uno de los grupos de LinkedIn relacionados con MySQL, así como la comunicación con colegas y gente de Habro :-)

    En este artículo quería escribir qué son los JOIN en MySQL en general y cómo se pueden optimizar las consultas con ellos.

    ¿Qué son las JOIN en MySQL?

    En MySQL, el término JOIN se usa mucho más de lo que piensas. Aquí, JOIN se puede llamar no solo una consulta que combina resultados de varias tablas, sino también una consulta a una tabla, por ejemplo, SELECT en una tabla también es una unión.

    Esto se debe a que el algoritmo de ejecución de unión en MySQL se implementa mediante bucles anidados. Aquellos. Cada JOIN posterior es un bucle anidado adicional. Para ejecutar una consulta y devolver todos los registros que satisfacen una condición, MySQL realiza un bucle y recorre los registros de la primera tabla en paralelo, verificando el cumplimiento de las condiciones descritas en el cuerpo de la solicitud cuando se encuentran registros que satisfacen la condición; condiciones, un bucle anidado a través de la segunda tabla busca registros que coincidan con la primera y satisfagan las condiciones de verificación, etc.

    Ejemplo de consulta normal con INNER JOIN

    SELECCIONAR
    *
    DE
    Tabla1
    UNIÓN INTERNA
    Tabla2 EN P1(Tabla1,Tabla2)
    UNIÓN INTERNA
    Tabla3 EN P2(Tabla2,Tabla3)
    DÓNDE
    P(Tabla1,Tabla2,Tabla3).

    Donde P: condiciones para fusionar tablas y filtros en la condición WHERE.

    Puede imaginar el siguiente pseudocódigo para ejecutar dicha solicitud.

    PARA cada uno fila t1 en la Tabla1 (
    SI(P(t1)) (
    PARA cada fila t2 en la Tabla2 (
    SI(P(t2)) (
    PARA cada fila t3 en la Tabla3 (
    SI P(t3) (
    t:=t1||t2||t3; SALIDAt;
    }
    }
    }
    }
    }
    }

    * Este código fuente fue resaltado con Resaltador de código fuente.

    Donde la construcción t1||t2||t3 significa concatenación de columnas de diferentes tablas.

    Si la consulta contiene OUTER JOIN, por ejemplo, LEFT OUTER JOIN

    SELECCIONAR
    *
    DE
    Tabla1
    UNIRSE A LA IZQUIERDA
    Tabla2 UNIÓN IZQUIERDA Tabla3 EN P2(Tabla2,Tabla3)
    EN P1(Tabla1,Tabla2)
    DÓNDE
    P(Tabla1,Tabla2,Tabla3)

    * Este código fuente fue resaltado con Resaltador de código fuente.

    Entonces el algoritmo para hacer esto consulta MySQL se verá algo como esto

    PARA cada fila t1 en T1 (
    BOOLf1:=FALSO;
    PARA cada fila t2 en T2 tal que P1(t1,t2) (
    BOOLf2:=FALSO;
    PARA cada fila t3 en T3 tal que P2(t2,t3) (
    SI P(t1,t2,t3) (
    t:=t1||t2||t3; SALIDAt;
    }
    f2=VERDADERO;
    f1=VERDADERO;
    }
    SI (!f2) (
    SI P(t1,t2,NULL) (
    t:=t1||t2||NULL; SALIDA t;
    }
    f1=VERDADERO;
    }
    }
    SI (!f1) (
    SI P(t1,NULL,NULL) (
    t:=t1||NULL||NULL; SALIDA t;
    }
    }
    }

    * Este código fuente fue resaltado con Resaltador de código fuente.

    Entonces, como podemos ver, los JOIN son solo un grupo de bucles anidados. Entonces, ¿por qué UNION y SELECT y las consultas con SUBQUERY también se unen en MySQL?

    El optimizador MySQL intenta llevar las consultas a la forma en que le resulte más conveniente procesarlas y ejecutarlas de acuerdo con el esquema estándar.

    Con SELECT todo está claro: solo un bucle sin bucles anidados. Todas las UNION se ejecutan como solicitudes individuales y los resultados se agregan a una tabla temporal, y luego MySQL trabaja con esta tabla, es decir recorriendo los registros que contiene. Es la misma historia con Subquery.

    Al reunir todo en una plantilla, por ejemplo, MySQL reescribe todas las consultas RIGHT JOIN con equivalentes LEFT JOIN.

    Pero la estrategia de ejecutar consultas a través de bucles anidados impone algunas restricciones, por ejemplo, debido a este esquema, MySQL no admite la ejecución de consultas FULL OUTER JOIN.

    Pero el resultado de dicha consulta se puede obtener utilizando la UNIÓN de dos consultas en la UNIÓN IZQUIERDA y en la UNIÓN DERECHA.
    Se puede ver un ejemplo de la solicitud en sí en el enlace wiki.

    ÚNETE al plan de ejecución de consultas

    A diferencia de otros RDBMS, MySQL no genera código de bytes para ejecutar una consulta, sino que genera una lista de declaraciones en forma de árbol a las que se adhiere el motor de ejecución de consultas al ejecutar la consulta.
    este árbol tiene siguiente vista y tiene el nombre de “árbol profundo a la izquierda”

    A diferencia de los árboles equilibrados (plan Bushy), que se utilizan en otros DBMS (por ejemplo, Oracle)

    ÚNETE a la optimización

    Pasemos ahora a la parte más interesante: la optimización de la unión.
    El optimizador de MySQL, es decir, la parte responsable de optimizar los JOIN, selecciona el orden en el que se fusionarán las tablas existentes, porque puede obtener el mismo resultado (conjunto de datos) cuando en diferente orden mesas en pegado. El optimizador MySQL evalúa el costo de diferentes planes y selecciona el de menor costo. La unidad de evaluación es la operación de una sola lectura de una página de datos de 4 kilobytes desde una ubicación aleatoria en el disco.

    Para el plan seleccionado, puede conocer el costo ejecutando el comando

    MOSTRAR EL ESTADO DE LA SESIÓN COMO "Last_query_cost";

    La estimación se basa en estadísticas: el número de páginas de memoria ocupadas por la tabla y/o los índices de esta tabla, la cardinalidad (número de valores únicos) de los índices, la longitud de los registros e índices, su distribución, etc. Durante su evaluación, el optimizador no asume que ninguna parte terminará en el caché; el optimizador asume que cada operación de lectura es un acceso al disco.

    A veces, el analizador-optimizador no puede analizar todos los planes de ejecución posibles y elige el incorrecto. Por ejemplo, si tenemos INNER JOIN en 3 tablas, entonces opciones posibles¡el analizador tiene 3! = 6, y si fusionamos 10 tablas, ¡entonces ya hay 10 opciones posibles! = 3628800... MySQL no puede analizar tantas opciones, por lo que utiliza un algoritmo de búsqueda codicioso en este caso.

    Pero no deberías aplicar este truco a todas las consultas, con la esperanza de optimizar las coincidencias y ahorrar tiempo al elaborar un plan de ejecución de consultas con el optimizador y agregar STRAIGH_JOIN a todas las consultas con uniones, porque Los cambios y fusiones de datos, que ahora son óptimos, pueden dejar de serlo con el tiempo y entonces las consultas comenzarán a retrasarse mucho.

    Además, como se mencionó anteriormente, los resultados de las combinaciones se colocan en tablas temporales, por lo que a menudo es apropiado usar una "tabla derivada" en la que imponemos todas las condiciones que necesitamos para la selección, y también especificamos LIMIT y el orden de clasificación. En este caso, nos desharemos de la redundancia de datos en la tabla temporal y también los ordenaremos por etapa temprana(basado en el resultado de una muestra, y no en el pegado final, lo que reducirá el tamaño de los registros que se ordenarán).

    Un ejemplo estándar del enfoque descrito anteriormente. Una selección sencilla para una relación de muchos a muchos: noticias y etiquetas para la misma.

    SELECCIONAR
    t.tid, t.descripción, n.nid, n.título, n.extract, n.modtime
    DE
    SELECCIONAR
    n.nid
    DE
    noticias sustantivo, femenino—
    DÓNDE
    n.tipo = 1321
    Y n.publicado = 1
    Estado Y = 1
    ORDEN POR
    n.modtime DESC
    LÍMITE
    200
    ) como noticia
    UNIÓN INTERNA
    noticias n ON n.nid = noticias.nid
    UNIÓN INTERNA
    news_tag nt ON n.nid = nt.nid
    UNIÓN INTERNA
    etiquetas t ON nt.tid = t.tid

    * Este código fuente fue resaltado con Resaltador de código fuente.

    Y por último, un pequeño problema que a veces planteo durante las entrevistas :-)

    Hay un sitio de blogs de noticias. Existen entidades como noticias y comentarios sobre ellas.

    Tarea: debe escribir una consulta que muestre una lista de 10 noticias cierto tipo(establecidas por el usuario) publicaciones ordenadas por tiempo en orden cronológico, y además mostrar no más de 10 comentarios recientes para cada una de estas noticias, es decir. si hay más comentarios, mostramos solo los últimos 10.

    Todo debe hacerse en una sola solicitud. Sí, puede que esto no sea lo más mejor manera, y eres libre de sugerir otra solución :-)

    Etiquetas: Agregar etiquetas



    
    Arriba