1

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

     |  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_id12345 OR user_id987654321 不存在于表中。

但我仍然想返回类似下面的内容:

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

3 回答 3

1

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

例如

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_idmy_table 列的数据类型是字符,那么我会将内联视图中的文字用单引号括起来。例如SELECT '12345' AS user_id。如果该列的字符集与您的客户端字符集不匹配,例如数据库列是 latin1,而客户端字符集是 UTF8,您可能希望强制字符串成为兼容(强制)字符集... SELECT _latin1'12345' AS user_id

于 2014-06-25T15:46:32.417 回答
-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 的表可能会占用大量磁盘空间。MySQL 中的一个整数列可以容纳 4,294,967,296 个 4 字节值,或者 16 GB 的数据,纯粹是为了方便您显示一些您没有的其他数据。因此,除非您需要一些较小的范围或一组可用的 ID,或者您的耳朵有磁盘空间,否则这种方法可能根本不实用。

就个人而言,我一开始不会要求数据库这样做。本质上这是一个显示问题;您已经从查询返回某些行这一事实中获得了所需的所有信息。我将解决数据库之外的显示问题,在您的情况下,这意味着用 PHP 填充那些零。

于 2014-06-25T15:17:03.710 回答
-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;

虽然这不是很有效。

于 2014-06-25T15:22:25.077 回答