我正在尝试构建一个取决于表单所选选项的查询。我想我已经完成了这个但是不要认为它看起来像我认为的那样有效(如果我给你看剧本,你会认为阅读圣经不会花这么长时间)。我想看看你们中是否有人提出任何想法以提高效率。
用户必须选择两件事:
首先,他们希望展示什么样的发票(albaran),(付费(pagado),开放(pte),不发行(sin factura),所有这些(todos))。 第二,发票(albaran)所指的客户(特定的一个或全部(todos))。 发票和客户是两个不同的mysql表,它们共享ref_cliente列
所有这些都是在page1.php中选择的,当填写表单并使用post方法发送时,页面会重新加载“激活”带有数组$ _POST loades的脚本。
感谢您的时间和兴趣!
编辑问题以添加OP的表格架构
TABLE clientes (columns: ref_cliente, nombre, nif)
TABLE facturas (columns: ref_factura, ref_cliente, estado)
estado
是一个varchar列,用于指示发票是已付款,未付款还是未付款。 (布尔效应)
答案 0 :(得分: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);
答案 1 :(得分:0)
好的,请看一下以下代码段。正如Morten Sickel所说,我们试图为您提供一些帮助。 BTW是你的NIF
指的是numérod'ntificfiscale?不应该是varchar
吗?我已经相应地创建了adn,请提供您需要的正确的详细信息和类型。
参考:
在上面的示例中,我根据您的Form的下拉选项放了几个简单的查询。例如。基于客户的付费发票,基于客户的未付款发票,为每个客户支付的所有付款,为每个客户支付的未付款,显示每个客户的所有发票(付款,未付)等...
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
;
每个abovce查询的结果。
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