MySQL:结合两个重复的查询

时间:2011-08-19 14:31:08

标签: php mysql sql select php-5.3

我在表中的信息中有pd_id NULL

doc_id  doc_title   doc_order   pg_id 
14      a.zip       1           NULL    
15      b.zip       2           NULL    
12      c.zip       1           16  
13      d.zip       2           16      
3       f.doc       3           16      
4       g.doc       4           16  

当我想用pg_id 16查询项目时,我这样做,

SELECT * 
FROM root_documents 
WHERE root_documents.pg_id = '16'

当我想要查询没有任何pd_id的项目时,我会这样做,

SELECT * 
FROM root_documents 
WHERE root_documents.pg_id IS NULL

我发现两个查询是重复的,所以我尝试这个,

SELECT * 
FROM root_documents 
WHERE (root_documents.pg_id = ? OR root_documents.pg_id IS NULL)

所以,当我想用​​pg_id 16,

查询项目时,我想得到这个结果
doc_id  doc_title   doc_order   pg_id 
12      c.zip       1           16  
13      d.zip       2           16      
3       f.doc       3           16      
4       g.doc       4           16

但是我得到了所有人的内容!

doc_id  doc_title   doc_order   pg_id 
14      a.zip       1           NULL    
15      b.zip       2           NULL    
12      c.zip       1           16  
13      d.zip       2           16      
3       f.doc       3           16      
4       g.doc       4           16

如何解决此问题,

SELECT * 
FROM root_documents 
WHERE (root_documents.pg_id = ? OR root_documents.pg_id IS NULL)

或者我必须像往常一样重复查询?

修改

当我将一个参数传递给占位符时,这个答案对我来说很奇怪:

SELECT * FROM root_documents WHERE (root_documents.pg_id = '16' OR (root_documents.pg_id IS NULL AND '16' IS NULL))

当没有参数时,

SELECT * FROM root_documents WHERE (root_documents.pg_id = NULL OR (root_documents.pg_id IS NULL AND NULL IS NULL))

请注意,当没有返回任何值时,我会将NULL传递给placeholder

4 个答案:

答案 0 :(得分:2)

抱歉:您正在使用MYSQL ......无视。

一种方法是:

SELECT * 
FROM root_documents 
WHERE isnull(root_documents.pg_id, -1) = ?

-1或您希望在[root_documents.pg_id]中找到的任何值。然后,当您要为该值搜索NULL查询时。

答案 1 :(得分:0)

你可以设置?当你想要那个pg_id时给一个数字,或者当你想要那个为空的时候给一个字符串IS NULL

答案 2 :(得分:0)

我想你想要这样的东西:

SELECT * 
FROM root_documents 
WHERE (root_documents.pg_id = ? OR (root_documents.pg_id IS NULL AND ? IS NULL))

答案 3 :(得分:0)

我认为以下内容适合您(已更新):

SELECT * 
FROM root_documents r1
WHERE (r1.pg_id = ? 
OR (NOT EXISTS 
 (SELECT * FROM FROM root_documents r2 
  WHERE r2.pg_id = ? )
 AND r1.pg_id IS NULL)