MySQL:如何检索符合间接标准的记录?

时间:2015-03-26 22:58:45

标签: mysql

让我先说一下,我对SQL非常陌生,而且我一直在努力解决这个问题。我正在使用的数据库是phpmyadmin。我所拥有的是一份有几个记录的表格,我需要知道哪些表格符合某些标准。具体来说,我需要知道哪些是待批准并且已经签署,所以我可以将它们标记为已批准。

有11个不同的签名请求字段(针对不同的部门),每个字段都有自己的签名字段。我需要知道哪些记录的签名请求字段标记为“批准”(意味着该部门需要签名)并在签名字段中有签名。最重要的是,我还需要它才能返回待批准的记录。

基本上表格如下:

+----+------------+--------+------------+--------+------------+--------+----------------+
| id | sign_rqst1 | sign1  | sign_rqst2 | sign2  | sign_rqst3 | sign3  |status          |
+----+------------+--------+------------+--------+------------+--------+----------------+
|  1 | Approval   | [sign] |            |        | Approval   | [sign] |Pending Approval|
|  2 |            |        | Approval   | [sign] | Approval   |        |Pending Approval|
|  3 | Approval   |        | Notice     |        |            |        |Pending Approval|
|  4 | Approval   | [sign] | Approval   | [sign] |            |        |Approved        |
+----+------------+--------+------------+--------+------------+--------+----------------+

我需要我的查询才能返回1并忽略2, 3 & 4。但我无法弄清楚如何编写查询来忽略不符合标准的记录。在这种情况下,ANDOR运营商似乎没有帮助我。

我试过了:

SELECT id
FROM table
WHERE sign_rqst1 IN ('Approval') AND sign1'' AND status = 'Pending Approval' AND

SELECT id
FROM table
WHERE sign_rqst2 IN ('Approval') AND sign2'' AND status = 'Pending Approval' AND

SELECT id
FROM table
WHERE sign_rqst3 IN ('Approval') AND sign3'' AND status = 'Pending Approval' AND

GROUP BY id;

这不会返回任何内容,OR会返回所有内容。

然后我尝试了这个(只使用一组列来查看它是否可行):

SELECT id
FROM table
WHERE sign_rqst1 IN ('Approval') AND status = 'Pending Approval'
GROUP BY id
HAVING COUNT(DISTINCT sign1'');

它没有解析那些没有签名的内容,所以我得到了Approval中标有sign_rqst1的每条记录。

我也尝试了一个临时表,但我甚至无法使该查询起作用。

我想我需要先搜索所有的Approvals,然后用它来搜索有签名的Approvals,但我不知道怎么做,而且我找不到任何帮助。有什么想法吗?

编辑:我应该补充一点,签名实际上是图像文件。我们使用的程序有一个签名权限按钮,当有人签名时,该按钮会被签名图像文件替换,因此在表格中它显示为so-and-so.png,因此使用<>''来抓取只有某些内容的字段他们是我弄清楚如何处理这个烂摊子的唯一方法。

CREATE TABLE `qms_engineering_change_order` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `eng_action` text,
  `eng_signature` text,
  `eng_action2` text NOT NULL,
  `eng_signature2` text NOT NULL,
  `eng_signature3` text NOT NULL,
  `eng_action3` text NOT NULL,
  `eng_action4` text NOT NULL,
  `eng_signature4` text NOT NULL,
  `plan_action` text,
  `plan_signature` text,
  `sc_action` text,
  `sc_signature` text,
  `qa_action` text,
  `qa_signature` text,
  `oth_action` text,
  `oth_signature` text,
  `dcc_signature` text,
  `dcc_signature` text,
  `prod_signature` text,
  `prod_action` text,
  `sales_action` text,
  `sales_signature` text,

3 个答案:

答案 0 :(得分:0)

在我看来问题就在于您编写查询的方式。尝试使用像这样的查询:

SELECT *
FROM table
WHERE status = 'Pending Approval' AND (
    sign_rqst1='Approval' AND sign1<>'' OR
    sign_rqst2='Approval' AND sign2<>'' OR
    sign_rqst3='Approval' AND sign3<>'');

答案 1 :(得分:0)

[udpated to handle nulls]

尝试以下方法:

SELECT *
FROM table
WHERE status = 'Pending Approval' AND
(
    ((ifnull(sign_rqst1,'') = 'Approval' AND ifnull(sign1,'')<>'') OR ifnull(sign_rqst1,'') = '') AND
    ((ifnull(sign_rqst2,'') = 'Approval' AND ifnull(sign2,'')<>'') OR ifnull(sign_rqst2,'') = '') AND
    . . .
    ((ifnull(sign_rqst11,'') = 'Approval' AND ifnull(sign11,'')<>'') OR ifnull(sign_rqst11,'') = '')
)

ifnull(expr1, expr2)如果不为空则返回expr1,否则返回expr2。这样我就可以确保将空字符串作为空字符串处理:''而不是NULL

答案 2 :(得分:0)

似乎我的创建Temporary Table的理论是要走的路,我花了一些时间来弄清楚如何利用这张桌子对我有利。我创建的表只显示所有Approval个动作及其Signatures,在两列而不是22列中编译。

CREATE TEMPORARY TABLE NeedApproval AS (
SELECT id, sign_rqst1 'ActionRequired', COALESCE(sign1) 'Signature'
FROM table
WHERE sign_rqst1 IN ('Approval') AND status = 'Pending Approval');

INSERT INTO NeedApproval
SELECT id, sign_rqst2 'ActionRequired', COALESCE(sign2) 'Signature'
FROM table
WHERE sign_rqst2 IN ('Approval') AND status = 'Pending Approval';

INSERT INTO NeedApproval
SELECT id, sign_rqst3 'ActionRequired', COALESCE(sign3) 'Signature'
FROM table
WHERE sign_rqst3 IN ('Approval') AND status = 'Pending Approval';

等..包括所有字段。我的桌子看起来更像是这样:

+----+------------+--------+
| id | sign_rqst1 | sign1  | 
|  1 | Approval   | [sign] | 
|  1 | Approval   | [sign] | 
|  2 | Approval   | [sign] | 
|  2 | Approval   |        | 
|  3 | Approval   |        |  
+----+------------+--------+

然后我使用了COUNT函数(我之前尝试过的更具体的版本)给了我所有Approval行为Signatures的所有记录。这是我在Temporary Table上使用的查询:

SELECT id
FROM NeedApproval
GROUP BY id
HAVING COUNT(*) = SUM(CASE WHEN signature<>'' THEN 1 ELSE 0 END);

数据库只有166条记录,所以我能够通过并手动检查它是否符合我的需要。这项工作非常完美,即使工作时间比我预期的要长一些。