使用Condition子句查询两个表中的选定列

时间:2018-01-11 05:50:21

标签: php mysql sql

我有两张桌子 -

1)**** Company_Form ****

[ Contract_No# 下,SOFTWARE_NAME,COMPANY_NAME,Vendor_Code]

2)**** User_Form ****

[Contract_No, Invoice_No# 下,Invoice_Date,INVOICE_AMOUNT,Invoice_Submit_Date]

粗体表示的字段是主键。

=>用户必须输入他想要获取其数据的软件名称。

=>我必须构建一个查询,我必须以下列形式显示结果:

[合同#,SOFTWARE_NAME,COMPANY_NAME,Invoice_No,Invoice_Date,Invoice_Submission_Date]

现在,

  • 一个Contract_No可以在其名称下包含许多Invoice_no 用户表单表。

  • 一次 Contract_No 只能出现一次 Company_Form表

  • 检索到的记录必须分组最新的Invoice_Date

我的逻辑是:

  1. 我必须先用该软件检索所有合同号 公司名称来自Company_Form表。
  2. 我必须从User_Form表中查询该合同号并显示 每个匹配合同的数据没有。取自Company_Form 表
  3. 问题在于我无法在SQL中构建可以为我执行任务的查询。

    请帮我制定查询。

    [PS]我在PHP中使用SQL。

    我尝试了一个类似的查询:

    我尝试了一种方法:

    SELECT a.ContractNo,a.SoftwareName,a.CompanyName,b.InvoiceNo,b.InvoiceDate,b.InvAmount,b.InvoiceSubmitDate
                FROM Company_Form as a,User_Form as b 
                WHERE b.ContractNo IN(SELECT ContractNo FROM Company_Form WHERE 
                                    SoftwareName='$Sname') AND a.ContractNo=b.ContractNo;
    

    但是我收到一个错误,即子查询返回超过1行。 我可以从中获得帮助吗?

3 个答案:

答案 0 :(得分:0)

我假设您正在尝试查找用户所选软件及其相应发票的最新价格。这是一种方法。如果测试结果令您满意,我可以添加必要的解释。

select uf.Contract_No#, 
       cf.Software_Name,
       cf.Company_Name,
       uf.Invoice_No#, 
       uf.Invoice_Date,
       uf.Invoice_Amount,
       uf.Invoice_Submit_Date
from User_Form uf
inner join ( 
             -- Most recent sale of software
             select Contract_No#, max(Invoice_Date)
             from User_Form 
             group by Contract_No#
           ) latest
on ( 
    -- Filter via join for latest match records
    uf.Contract_No# = latest.Contract_No#
    and uf.Invoice_Date = latest.Invoice_Date
   )
inner join Company_Form cf
on cf.Contract_No# = uf.Contract_No#
where cf.Software_name = :software_name

答案 1 :(得分:0)

If the requirement allows your sub query to return more than one row, I would suggest you to use IN instead of = in the where clause of your main query.

Please note that I have just looked at the query and have not fully understood the requirements.

Thanks.

答案 2 :(得分:0)

我工作了一段时间,最后来到了以下查询,其功能就像魅力

SELECT a.ContractNo,a.SoftwareName,a.CompanyName,b.InvoiceNo,b.InvoiceDate,b.InvAmount,b.ISD
     FROM Company_Form as a,User_Form as b
     WHERE b.ContractNo IN (SELECT ContractNo FROM Company_Form WHERE SoftwareName='$Sname') 
                        AND a.ContractNo=b.ContractNo;

如果有人需要帮助来理解此查询的逻辑,请随时在下面发表评论。