【问题标题】:Select fields of a table with a conditional WHERE clause使用条件 WHERE 子句选择表的字段
【发布时间】:2014-06-20 14:53:26
【问题描述】:

我在 MySql 中有 3 个左连接表。

contratos,存储客户数据

funcionario,存储员工数据

cobranca,存储每笔客户费用。

我想生成基于费用status 的报告。但是每个客户费用有很多status,我想检索当前的status

以下代码返回来自cobrancas 表的最后更新。

SELECT cob.status, cob.created, con.data_venda, cpn.contrato, con.razao_social, con.cnpj, con.valor, f.nick
FROM cobrancas cob
LEFT JOIN contratos con
ON c.id = cob.contrato
LEFT JOIN funcionarios f
ON f.id = cob.cobrador
WHERE 1=1
ORDER BY cob.created DESC
LIMIT 1

但它返回时没有 status 过滤器。如果我放置一个像cob.status = 'x' 这样的WHERE 子句,它会返回带有status 的最后一条记录,但它可能不是当前的。那么我如何在 WHERE 子句中检查 cob.status 是否是当前的 status 来决定是否将其放入列表中?比如:

WHERE IF(cob.status == the last status inserted AND cob.status == 'x')

你能理解我想做什么吗?谢谢。

【问题讨论】:

  • 你如何决定当前的状态是什么?
  • 我在第一个查询中使用 ORDER BY DESCLIMIT 1。但我不知道如何在 Where 子句中执行此操作。我有一个存储日期和小时的 created 字段。
  • 如果可行的话,你的问题在哪里?

标签: mysql sql where-clause conditional-statements


【解决方案1】:

使用子查询的一种解决方案

select * from
(
SELECT cob.status, cob.created, con.data_venda, cpn.contrato, con.razao_social, con.cnpj, con.valor, f.nick
FROM cobrancas cob
LEFT JOIN contratos con
ON c.id = cob.contrato
LEFT JOIN funcionarios f
ON f.id = cob.cobrador
WHERE 1=1
ORDER BY cob.created DESC
LIMIT 1
) where status = 'X'

【讨论】:

  • 将其他2张表加入外部查询,会更快
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多