返回值甚至结果都是空的

时间:2014-06-25 14:53:26

标签: php sql empty-list

我有一张类似下面的表格。

     |  user_id  |   point_1  | point_2  | point_3
        453123        1234         32       433
        321543         1           213      321

我的查询是这样的:

$query = "SELECT * FROM my_table WHERE user_id = 12345 OR user_id = 987654321"

显然,由于user_id 12345或桌面上不存在user_id 987654321,因此不返回任何内容。

但是我仍然希望返回类似下面的内容:

|  user_id   |   point_1  | point_2  | point_3
    12345           0           0         0
  987654321         0           0         0

3 个答案:

答案 0 :(得分:1)

您可以使用内联视图作为查询的行源。要返回零代替NULL(如果在my_table中找不到匹配的行,将由外部联接返回,您可以使用IFNULL函数。

e.g。

SELECT s.user_id
     , IFNULL(t.point_1,0) AS point_1
     , IFNULL(t.point_2,0) AS point_2
     , IFNULL(t.point_3,0) AS point_3
  FROM ( SELECT 12345 AS user_id
         UNION ALL SELECT 987654321
       ) s
  LEFT
  JOIN my_table t
    ON t.user_id = s.user_id

注意:如果user_id列my_table的数据类型是字符,那么我会将内联视图中的文字用单引号括起来。例如的 SELECT '12345' AS user_id 即可。如果列的字符集与您的客户端字符集不匹配,例如数据库列是latin1,客户端字符集是UTF8,你想强制字符串是兼容的(可强制的)字符集...... SELECT _latin1'12345' AS user_id

答案 1 :(得分:-1)

您想要的结果类似于OUTER JOIN的结果 - 当某些记录仅存在于一个表中而不存在于另一个表中时,OUTER JOIN将显示来自其中一个连接表的所有行,在具有NULL值的其他表中缺少字段。

要纯粹在SQL中解决您的特定问题,您可以创建第二个表,其中包含一个字段,其中包含您希望能够在结果中显示的所有user_id值。类似的东西:

+-----------+
| user_id   |
+-----------+
| 1         |
+-----------+
| 2         |
+-----------+
| 3         |
+-----------+
| ...       |
+-----------+
| 12344     |
+-----------+
| 12345     |
+-----------+
| 12346     |
+-----------+
| ...       |
+-----------+

等等。如果第二个表名为all_ids,则可以通过如下修改查询来获得所需结果(具体语法可能因数据库实现而异):

SELECT
    *
FROM
    all_ids AS i
        LEFT OUTER JOIN
    my_table AS t ON i.user_id = t.user_id
WHERE
    i.user_id = 12345 
        OR i.user_id = 987654321;

这应该产生以下结果集:

+-----------+----------+----------+----------+
| user_id   | point_1  | point_2  | point_3  |
+-----------+----------+----------+----------+
| 12345     | NULL     | NULL     | NULL     |
+-----------+----------+----------+----------+
| 987654321 | NULL     | NULL     | NULL     |
+-----------+----------+----------+----------+

应该注意的是,这个充满ID的表可能会占用大量的磁盘空间。一个integer column in MySQL can hold 4,294,967,296 4-byte values或16 GB的数据纯粹是为了方便您显示所拥有的其他数据。因此,除非您需要一些较小范围或一组ID可用,或者磁盘空间不大,否则这种方法可能不太实用。

就个人而言,我不会要求数据库首先执行此操作。基本上这是一个显示问题;您已经获得了所需的所有信息,因为查询返回的某些行。我会解决数据库之外的显示问题,在你的情况下意味着用PHP填充那些零。

答案 2 :(得分:-1)

仅使用select语句无法获得所需的结果。只返回存在于某处的行。

我能想到的唯一方法是将查询值插入到临时表中,然后将外部联接插入到查询中。

所以基本过程将是:

create table temp1 (user_id integer);

insert into temp1 values (987654321); -- repeat as needed for query.

select t.user_id, m.* from temp1 t left outer join my_table m on m.user_id = t.user_id;

drop table temp1;

虽然效率不高。