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

时间:2017-05-02 21:04:52

标签: 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 ['搜索']中输入的值相匹配,可以是客户名称,通过(午餐盒),食物,还是任何商品?尝试这样做但它不起作用

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

1 个答案:

答案 0 :(得分:0)

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

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

IDEAL DATABASE DESIGN

尝试在模式中添加外键:

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);