Registrar un uso de la sintaxis de sql union

En el proyecto anterior, los contenidos de las dos tablas completamente independientes deben extraerse y mostrarse en la misma categoría. Y no debe afectar el uso de las funciones existentes del proyecto anterior y debe modificarlo rápidamente y conectarse en línea .
Lo primero que me viene a la mente es: trate de evitar modificar drásticamente el código del proyecto antiguo (productos frágiles).
En este momento, se me ocurrió el plan de modificación más fácil de entender: consultar el contenido que debe reflejarse en las dos tablas respectivamente, y poner los datos De vuelta al primer plano, el primer plano realiza la representación de datos leyendo los datos de las dos interfaces.
Sin embargo,
este proceso aparentemente muy simple no es la mejor solución si lo piensa. Por ejemplo:
1. El front-end necesita solicitar dos interfaces diferentes para que los datos se combinen, y los campos de las dos tablas no son uniformes
. 2. Cuando el front-end procesa los datos para la paginación, el cálculo del número total y el número de páginas no es muy bueno. (La función de paginación realizada por el complemento utilizado en el front-end)
3. El front-end responsable del proyecto antiguo se ha ido. Como programa de back-end, tengo que estar familiarizado con el complemento antes de modificar la página. El riesgo de error aumenta.
Por lo tanto, pienso en otra solución:
si Puede haber una forma de consultar los datos de dos tablas diferentes al mismo tiempo para fusionar y devolver, de modo que solo necesite modificar el archivo de interfaz y una pequeña cantidad de código de front-end.
Después de verificar, realmente existe tal método. La sintaxis de union de sql, le di la vuelta al manual de tp y entendí el uso de union.El ejemplo es muy simple.

UNION操作用于合并两个或多个 SELECT 语句的结果集
Db::field('name')
      ->table('think_user_0')
      ->union('SELECT name FROM think_user_1')
      ->union('SELECT name FROM think_user_2')
      ->select();

Es muy simple, pero como nunca antes había usado esta gramática, todavía necesito aprender más y continuar estudiando el uso básico de union:
1. La premisa de usar union, la columna correspondiente a la instrucción SELECT en UNION debe tener datos similares Escriba
como: dos tablas table1 (field aid aname atel) y table2 (field bid bname btel), quiero consultar los valores de id y name de las dos tablas, luego el tipo de campo de aid y bid es el mismo, y el tipo de datos de ananme y bname es el mismo. utilizar.
2. El número de campos de las dos tablas que se van a consultar por unión debe ser el mismo y el orden de los campos debe ser uno a uno, como por ejemplo:

Db::field('aid,aname')
      ->table('table1')
      ->union('SELECT bid,bname FROM table2')
      ->select();

3 Las consultas de ordenación, condiciones y paginación todavía se escriben de acuerdo con lo que deberían escribirse antes, como:

Db::field('aid,aname')
      ->table('table1')
      ->union('SELECT bid,bname FROM table2 WHERE bsex="1"')//条件
      ->order('bcreatetime desc')//排序
      ->page($p,$listpage)//分页,根据自己的分页来
      ->select();

Después de comprender el uso básico, para la situación de mi proyecto, estos son suficientes y comienzan a modificar.
Aunque los dos campos de la tabla del proyecto anterior no se corresponden completamente, la mayoría de los tipos de campo siguen siendo correspondientes. Solo necesito consultar los campos correspondientes y devolverlos uno por uno, lo cual es conveniente para los datos de renderizado del front-end y separar los campos de las dos tablas. Todos tienen el mismo alias, como ayuda como id, bid como id. Los datos completos devueltos de esta manera se pueden representar directamente con id. Es conveniente para el front-end para la paginación, y la interfaz puede procesar directamente los datos de paginación y devolverlos al front-end. Consulte la cantidad de datos de las dos tablas respectivamente y luego haga la suma para calcular el número de páginas y la cantidad.

public function index(){
    
    
    $p=input('p',1,'intval');//页面
     $listpage=input('listpage',10,'intval');//分页大小
     $dlist=Db::field('id,dname name,dimages image,dcreatetime pcreatetime,1 type,dcontent content')//换成自己查询的字段即可
         ->table('cen_deal')
         ->union('SELECT id,pname name,pimages image,pcreatetime,2 type,pcontent content FROM cen_collection WHERE cjlist="2"')
	  ->page($p,$listpage)
	  ->order('pcreatetime desc')
         ->select();
	$count=Db::name('ddeal')->order('dcreatetime desc')->count();
	$count2=Db::name('ccollection')->order('pcreatetime desc')->where('cjlist','2')->count();
	$countzh=$count+$count2;
	$totalPage=ceil($countzh/$listpage);
      if($dlist){
    
    
          return json(['data'=>$dlist,'code'=>1,'message'=>'success','totalPage'=>$totalPage,'count'=>$countzh,'p'=>$p]);
      }else{
    
    
          return json(['data'=>'无数据','code'=>2,'message'=>'fail']);
      }
}

De esta manera, la interfaz solo necesita modificar el campo renderizado (modificado al alias después de como), y puede cambiar de mostrar el contenido de una tabla a mostrar el contenido de dos tablas no relacionadas.

Supongo que te gusta

Origin blog.csdn.net/qq_36129701/article/details/90768667
Recomendado
Clasificación