1

我正在尝试构建一个取决于表单的选定选项的查询。我想我已经完成了这个,但不认为它看起来像我想象的那样高效(如果我给你看脚本,你会认为阅读圣经不会花这么长时间)。我想看看你们中是否有人愿意提出任何想法以提高效率。

用户必须选择两件事:

首先,他们想要显示什么样的发票(albaran),(paid(pagado),open(pte),不开票(sin factura),所有这些(todos))。其次,发票(albaran)指的是哪个客户(特定的一个或全部(todos))。发票和客户是共享 ref_cliente 列的两个不同的 mysql 表

所有这些都是在 page1.php 中选择的,当表单被填写并使用 post 方法发送时,页面重新加载“激活”带有数组 $_POST 加载的脚本。

感谢您的时间和兴趣!

编辑问题以添加 OP 的表模式

TABLE clientes (columns: ref_cliente, nombre, nif) TABLE facturas (columns: ref_factura, ref_cliente, estado)

estado是一个 varchar 列,指示发票是否已支付、未支付或未开具。(布尔效果)

4

2 回答 2

0

正如 bonCodigo 所说,如果您显示表模式,它可能更容易提供帮助......但是,我会尝试一下。

我将使用两个参数“status”和“client”进行设置,然后必须根据这些参数的值构建 SQL。我正在使用 PDO

喜欢:

$sql="SELECT * from invoices i, clients c where c.ref_cliente=i.ref_cliente";
$params=array();
if($_POST['status']!='todos'){
   $sql.=' and i.status=?';
   $params[]=$_POST['status'];
}
if($_POST['clients']!='todos'){
   $sql.=' and c.ref_cliente=?';
   $params[]=$_POST['clients'];
}
$sqlh=$dbh->prepare($sql); // $dbh must be set up, see the PDO-documentation
$sqlh->execute($params);
于 2012-11-28T12:26:49.830 回答
0

好吧,看看下面的代码片段。正如 Morten Sickel 所说,我们试图为您提供一些帮助。顺便说一句,您NIF指的是 numéro d'identification 财务吗?不应该varchar吗?我已经相应地创建了,请输入您需要的正确详细信息和类型。

参考:

SQLFIDDLE

在上面的示例中,我根据表单的下拉选择放置了您提到的多个简单查询。例如,基于客户的已付发票、基于客户的未付发票、计算每个客户的所有已付、未付的每个客户、显示每个客户的所有发票(已付、未付)等...

MySQL 查询:

//-- show todos facturas/cliente
SELECT c.*,f.*
FROM clientes c, facturas f
WHERE c.ref_cliente = f.ref_cliente
ORDER BY c.ref_cliente
;

//-- show pagado(paid) facturas/cliente
SELECT c.*,f.*
FROM clientes c, facturas f
WHERE c.ref_cliente = f.ref_cliente
AND f.estado = 'Paid'
ORDER BY c.ref_cliente
;

//-- show pte(open/unpaid) facturas/cliente
SELECT c.*,f.*
FROM clientes c, facturas f
WHERE c.ref_cliente = f.ref_cliente
AND f.estado = 'NotPaid'
ORDER BY c.ref_cliente
;

//-- count number of paid, unpaid facturas/cliente
SELECT c.*, 
COUNT(CASE WHEN f.estado = 'Paid'
THEN f.ref_cliente END) AS PAID,
COUNT(CASE WHEN f.estado = 'NotPaid'
THEN f.ref_cliente END) AS NOTPAID
FROM clientes c, facturas f
WHERE c.ref_cliente=f.ref_cliente
GROUP BY c.ref_cliente
;

//-- with a group concat to show paid/open facturas/cliente
SELECT c.*, 
GROUP_CONCAT(CASE WHEN f.estado = 'Paid'
THEN f.ref_factura END) AS PAID,
GROUP_CONCAT(CASE WHEN f.estado = 'NotPaid'
THEN f.ref_factura END) AS UNPAID
FROM clientes c, facturas f
WHERE c.ref_cliente=f.ref_cliente
GROUP BY f.ref_cliente
;

结果:对于上面的每个查询。

REF_CLIENTE     NOMBRE  NIF         REF_FACTURA     ESTADO
1               428     57432844Z   1001A           Paid
1               428     57432844Z   1005D           NotPaid
2               418     67832814K   1002B           NotPaid
2               418     67832814K   1001B           NotPaid
2               418     67832814K   1002A           Paid
3               438     87932854F   1001C           Paid
4               448     97232834S   1003A           Paid


REF_CLIENTE     NOMBRE  NIF         REF_FACTURA     ESTADO
1               428     57432844Z   1001A           Paid
2               418     67832814K   1002A           Paid
3               438     87932854F   1001C           Paid
4               448     97232834S   1003A           Paid


REF_CLIENTE     NOMBRE  NIF         REF_FACTURA     ESTADO
1               428     57432844Z   1005D           NotPaid
2               418     67832814K   1002B           NotPaid
2               418     67832814K   1001B           NotPaid

//-- count number of paid, unpaid facturas/cliente
REF_CLIENTE     NOMBRE  NIF         PAID    NOTPAID
1               428     57432844Z   1       1
2               418     67832814K   1       2
3               438     87932854F   1       0
4               448     97232834S   1       0

//-- with a group concat to show paid/open facturas/cliente
REF_CLIENTE     NOMBRE  NIF         PAID    UNPAID
1               428     57432844Z   1001A   1005D
2               418     67832814K   1002A   1002B,1001B
3               438     87932854F   1001C   (null)
4               448     97232834S   1003A   (null)

PS:对不起,我不是特别使用PHP,因此您需要将查询放入正确的PHP语法中。诸如estado和之类的参数ref_cliente可能是您从表单的下拉/文本字段中传递的,以通过 sql 触发数据库。MortenSickel似乎可以帮助您:P

于 2012-11-29T01:28:58.230 回答