mysql - 在 MySQL 中组合多个 SELECT 和 CREATE 查询

标签 mysql join

在 PHP 文件中,我有多个查询,因为我使用多个表,并且使用数据获取并显示此类数据。这些查询可以合并为一个吗?如果有人知道我想告诉我代码是什么样的:

SELECT * FROM compras ; 

SELECT * FROM clientes WHERE idcliente = '$row[idcliente]'

SELECT * FROM pedidos_ventas WHERE idcompra = '$row[idcompra]'

SELECT * FROM mercaderias WHERE idmerc = '$rowped[idmercaderia]' LIMIT 1



CREATE TABLE IF NOT EXISTS `clientes` (
      `idcliente` INT(10) NOT NULL AUTO_INCREMENT,
      `nombre` VARCHAR(50) NOT NULL,
      `apellido` VARCHAR(50) NOT NULL,
      `domicilio` VARCHAR(50) NOT NULL,
      `telefono` VARCHAR(50) DEFAULT NULL,
      `movil` VARCHAR(50) DEFAULT NULL,
      `dni` VARCHAR(10) NOT NULL,
      `familiar` VARCHAR(50) NOT NULL,
      PRIMARY KEY (`idcliente`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

    CREATE TABLE IF NOT EXISTS `compras` (
      `idcompra` INT(7) NOT NULL AUTO_INCREMENT,
      `idcliente` INT(7) NOT NULL,
      `observacion` text NOT NULL,
      `fecha_ingreso` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`idcompra`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

    CREATE TABLE IF NOT EXISTS `entregas_ventas` (
      `identrega` INT(11) NOT NULL AUTO_INCREMENT,
      `idcompra` INT(11) NOT NULL,
      `entrega` DOUBLE(7,2) NOT NULL,
      `fecha` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`identrega`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

    CREATE TABLE IF NOT EXISTS `mercaderias` (
      `idmerc` INT(7) NOT NULL AUTO_INCREMENT,
      `cantidad` INT(5) NOT NULL,
      `codigo` VARCHAR(20) NOT NULL,
      `producto` VARCHAR(100) NOT NULL,
      `preciofinal` DOUBLE(7,2) NOT NULL,
      PRIMARY KEY (`idmerc`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

    CREATE TABLE IF NOT EXISTS `pedidos_ventas` (
      `idpedido` INT(7) NOT NULL AUTO_INCREMENT,
      `idcompra` INT(7) NOT NULL,
      `idmercaderia` INT(7) NOT NULL,
      `kilo` DOUBLE(7,2) NOT NULL,
      `precio` DOUBLE(7,2) NOT NULL,
      PRIMARY KEY (`idpedido`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

select compras.idcompra, case when clientes.idcliente is null 
         then 'ninguno' else CONCAT(clientes.nombre, ',', clientes.apellido)
    end as nombre, case when pedidos_ventas.idmercaderia = '-1' then 'Vianda saludable' when pedidos_ventas.idmercaderia = '-2' then 'Comida Sana'  else mercaderias.producto end as mercaderia,  pedidos_ventas.kilo, pedidos_ventas.precio  from compras 
    left join clientes  on (compras.idcliente=clientes.idcliente) 
    left join pedidos_ventas on (pedidos_ventas.idcompra=compras.idcompra) 
    left join mercaderias on (pedidos_ventas.idmercaderia=mercaderias.idmerc)  
    order by compras.idcompra asc

如果现在我想使用 LIKE 来查看它是否与我在输入 $ _POST ['search'] 中输入的值匹配,可以是客户姓名、vianda(午餐盒)、食物或任何商品??尝试这样做,但不起作用

SELECT compras.idcompra, CASE WHEN clientes.idcliente IS NULL 
     THEN 'ninguno' ELSE CONCAT(clientes.nombre, ',', clientes.apellido)
END AS nombre, CASE WHEN pedidos_ventas.idmercaderia = '-1' THEN 'Vianda saludable' WHEN pedidos_ventas.idmercaderia = '-2' THEN 'Comida Sana'  ELSE mercaderias.producto END AS mercaderia,  pedidos_ventas.kilo, pedidos_ventas.precio  FROM compras 
LEFT JOIN clientes  ON (compras.idcliente=clientes.idcliente) 
LEFT JOIN pedidos_ventas ON (pedidos_ventas.idcompra=compras.idcompra) 
LEFT JOIN mercaderias ON (pedidos_ventas.idmercaderia=mercaderias.idmerc)  WHERE mercaderias.producto LIKE '%comida%' OR..... LIKE clientes... or LIKE ..
ORDER BY compras.idcompra ASC

最佳答案

对于使用当前架构的查询,请尝试以下操作:

SELECT * FROM compras
INNER JOIN clientes ON (compras.idcliente = clientes.idcliente) 
INNER JOIN pedidos_ventas ON (compras.id = pedidos_venta.id) 
INNER JOIN mercaderias ON (pedidos_ventas.idmercaderia = mercaderias.idmerc) 
WHERE clientes.idcliente = :clienteid
AND compras.idcompra = :compraid 
AND mercaderias.idmerc = :mercaderiaid

理想的数据库设计

尝试将外键添加到您的架构中:

CREATE TABLE IF NOT EXISTS `cliente` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `nombre` VARCHAR(50) NOT NULL,
  `apellido` VARCHAR(50) NOT NULL,
  `domicilio` VARCHAR(50) NOT NULL,
  `telefono` VARCHAR(50) DEFAULT NULL,
  `movil` VARCHAR(50) DEFAULT NULL,
  `dni` VARCHAR(10) NOT NULL,
  `familiar` VARCHAR(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

CREATE TABLE IF NOT EXISTS `mercaderia` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `cantidad` INT(5) NOT NULL,
  `codigo` VARCHAR(20) NOT NULL,
  `producto` VARCHAR(100) NOT NULL,
  `preciofinal` DOUBLE(7,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `compra` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `cliente_id` INT(10) NOT NULL,
  `observacion` text NOT NULL,
  `fecha_ingreso` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_compra_cliente`
      FOREIGN KEY (`cliente_id`)
      REFERENCES `cliente` (`id`)
      ON DELETE NO ACTION
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `entregas_venta` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `compra_id` INT(10) NOT NULL,
  `entrega` DOUBLE(7,2) NOT NULL,
  `fecha` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_entregas_venta_compra`
      FOREIGN KEY (`compra_id`)
      REFERENCES `compra` (`id`)
      ON DELETE NO ACTION
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

CREATE TABLE IF NOT EXISTS `pedidos_venta` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `compra_id` INT(10) NOT NULL,
  `mercaderia_id` INT(10) NOT NULL,
  `kilo` DOUBLE(7,2) NOT NULL,
  `precio` DOUBLE(7,2) NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `fk_pedidos_venta_compra`
      FOREIGN KEY (`compra_id`)
      REFERENCES `compra` (`id`)
      ON DELETE NO ACTION,
  CONSTRAINT `fk_pedidos_venta_mercaderia`
      FOREIGN KEY (`mercaderia_id`)
      REFERENCES `mercaderia` (`id`)
      ON DELETE NO ACTION
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

然后使用查询:

$stmt = $pdo->prepare(<<<SQL
    SELECT * FROM compra
    INNER JOIN cliente ON (compra.cliente_id = cliente.id) 
    INNER JOIN pedidos_venta ON (compra.id = pedidos_venta.id) 
    INNER JOIN mercaderia ON (pedidos_venta.mercaderia_id = mercaderia.id) 
    WHERE cliente.id = :clienteid
    AND compra.id = :compraid 
    AND mercaderia.id = :mercaderiaid
SQL
);
$stmt->execute(':clienteid' => $clienteid, ':compraid' => $compraid, ':mercaderiaid' => $mercaderiaid);

关于mysql - 在 MySQL 中组合多个 SELECT 和 CREATE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43747214/

相关文章:

mysql - 如何将没有每列数据的 CSV 文件导入到 mySQL 中

javascript - php 不将 "echoing"表行作为调用 javaScript 函数的链接吗?

sql - 连接到为每行单独创建的整数范围

mysql - 左连接使用 3 个表的嵌套 select 语句

postgresql - 错误 : invalid reference to FROM-clause

mysql - 查找两个表中的差异

php - MYSQL基于CASE查询多个字段

PHP 对 MySQL 中的数组计数不正确

php - 如何使用下拉菜单显示mysql数据?

php - 根据另一个单元格的值在查询中连接 mysql 表