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 または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_id列 my_table のデータ型が文字の場合、インライン ビューのリテラルを一重引用符で囲みます。例えばSELECT '12345' AS user_id。列の文字セットがクライアントの文字セットと一致しない場合、たとえば、データベースの列が latin1 で、クライアントの文字セットが UTF8 の場合、文字列を強制的に互換性のある (強制可能な) 文字セットにする必要があります... SELECT _latin1'12345' AS user_id

于 2014-06-25T15:46:32.417 に答える
-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 に答える