多个表上的多个select-option mysql查询

时间:2012-11-28 11:31:21

标签: php mysql

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

用户必须选择两件事:

首先,他们希望展示什么样的发票(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列,用于指示发票是已付款,未付款还是未付款。 (布尔效应)

2 个答案:

答案 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,请提供您需要的正确的详细信息和类型。

参考:

SQLFIDDLE

在上面的示例中,我根据您的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语法中。诸如estadoref_cliente之类的参数可能是从表单的下拉/文本字段传递到通过sql触发数据库的。 MortenSickel 似乎能够帮助你:P