【问题标题】:Issues with multiple SELECT statement多个 SELECT 语句的问题
【发布时间】:2016-04-26 11:29:27
【问题描述】:

大家好,我目前正在处理一个路边缺陷项目,并且在我的研究中遇到了困难。 我正在尝试使用 sql 代码从不同的表中选择多个值

$sql = "SELECT d.defect_Id, d.priority, r.date 
        FROM `defect_report` AS d, 
        `report` AS r
        WHERE d.report_Id = r.report_Id";           

此代码在下面选择我需要的值:

defect_Id | priority | date
64           1         2016-01-06 19:17:40
65           3         2016-01-06 19:17:47
81           2         2016-01-06 19:17:47
82           1         2016-01-06 19:17:47
83           1         2016-01-06 19:17:47
66           3         2016-01-06 19:18:30
67           5         2016-01-06 19:18:37
68           4         2016-01-06 19:18:43
69           1         2016-01-06 19:18:49

但是,当我分配作业时,我希望上表仅显示未分配的作业。我使用的表单一次只显示一个作业,并允许我将维修团队提交给作业,并在作业表中为其分配作业编号并发布时间戳。

例如,一旦提交缺陷 64,就会在作业表中分配给一个团队。如何添加到下面的代码中,以便在页面重定向时不会再次显示此缺陷。

foreach ($cxn->query($sql) as $row )  
{
    echo "<tr><td><input type='text' name='defect_Id' value='$row[defect_Id]'</td>";
    echo "<td>$row[priority]</td>";
    echo "<td>$row[date]</td></tr>";
}
echo"</table>";

我尝试了许多选项,但我的语法错误。实际上,这就是我试图在一个 sql 语句中实现 2 个 WHERE 子句的原因,这可能吗?

$sql = "SELECT d.`defect_Id`,d.`priority`, r.`date`
        FROM `defect_report` AS d, `report` AS r
        WHERE r.`report_Id` = d.`report_ID`
        OR
        WHERE NOT EXISTS 
        (                         
        SELECT  `defect_Id`
        FROM job AS j
        WHERE d.`defect_Id` = j.`defect_Id` )";

在 Job 表中,主键是 job_Id 索引为defect_Id & repair_Team

defect_report 表中,主键为defect_Id,索引为report_Id

在报告表中,主键是report_Id,报告人的索引为member_Id

非常感谢。

【问题讨论】:

  • 这需要大量代码。你能不把它简化到关键部分吗
  • 也标记 dbms 使用。 (那里有一些非 ANSI SQL...)
  • 也是这些代码片段之一,在此之后Once submitted defect 64 will have a assigned 被 PHP 标记弄乱了
  • 这是一个漏掉的错误
  • 我想确保我理解这一点。您要查找的查询是否应该返回来自 defect_report 的尚未分配维修团队的记录?

标签: php sql select syntax where-clause


【解决方案1】:

您使用WHERE 子句作为连接条件。虽然这样可行,但使用 JOIN 子句时,更复杂的查询更具可读性。

像这样将 Job 表添加到您的查询中:

SELECT d.`defect_Id`, r.`date`, d.`priority` 
FROM `defect_report` AS d 
JOIN `report` AS r 
ON r.`report_Id` = d.`report_ID` 
LEFT JOIN `job` AS j ON d.`defect_Id` = j.`defect_Id` 
WHERE j.`defect_Id` IS NULL

LEFT 关键字可确保您也获得那些没有相应工作记录的记录。然后WHERE 子句会丢弃存在匹配作业记录的情况,留下您感兴趣的结果。

【讨论】:

  • 以上编辑的查询效果很好,您为我减轻了很多压力,非常感谢!
  • 不客气。请注意,仅当您在列名中使用了保留字或空格或非标准符号时才需要反引号。我个人认为它们看起来很丑,所以我尽量避免它们。
猜你喜欢
  • 1970-01-01
  • 2012-08-13
  • 2023-04-11
  • 1970-01-01
  • 2012-08-05
  • 2014-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
相关资源
最近更新 更多