在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
答案 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);