我有一张类似下面的表格。
| 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
答案 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;
虽然效率不高。