1

「プロファイル」テーブルがあります

  1. ユーザーID
  2. キー値

明らかに、ユーザーがログインしたときにユーザー ID に多くの行を含めることができます。ユーザーデータを session_var に格納すると、クエリは 3 つのテーブルを使用します。

  1. ユーザー
  2. プロファイル
  3. openid

私はこれを持っていた、

$sql = "SELECT op.provider, g . * , gp . *, CONCAT(g.firstname, ' ', g.lastname) AS fullname
    FROM openid AS op
    INNER JOIN users AS g ON g.userid = op.userid
    INNER JOIN profiles AS gp ON gp.userid = op.userid
    WHERE op.openid =$openid";

ただし、「プロファイル」テーブルにある行の数に応じて、重複データを含む複数の行を返します

これは私が望むものではありません。可能であれば、すべてのデータを 1 行にまとめる必要があります

最も効率的なソリューションは何ですか? PHP配列に保存する必要もあります。PHPは重複キーをどのように処理しますか?

4

2 に答える 2

1

おそらく次のようなものが必要ですdistinct

$sql = "SELECT distinct op.provider, g . * , gp . *, CONCAT(g.firstname, ' ', g.lastname) AS fullname
    FROM openid AS op
    INNER JOIN users AS g ON g.userid = op.userid
    INNER JOIN profiles AS gp ON gp.userid = op.userid
    WHERE op.openid =$openid";

それまたは、group byデータをグループ化する列で a を使用します。

最後に、複数行のデータを 1 つのフィールドに返したい場合 (ただしそれらは異なります)、mysqlgroup_concat()関数を使用してそうすることができます。

mysql> select * from first;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
+------+-------+
3 rows in set (0.00 sec)

mysql> select group_concat(id) as IDs, group_concat(title) as Titles from first;
+-------+----------------+
| IDs   | Titles         |
+-------+----------------+
| 1,2,3 | aaaa,bbbb,cccc |
+-------+----------------+
1 row in set (0.00 sec)

さて、次のようにサンプル テーブルに行を追加しました。

mysql> select * from first;
+------+-------+
| id   | title |
+------+-------+
|    1 | aaaa  |
|    2 | bbbb  |
|    3 | cccc  |
|    4 | NULL  |
|    5 | eeee  |
+------+-------+
5 rows in set (0.00 sec)

そして今、これをgroup_concat返します:

mysql> select group_concat(id) as IDs, group_concat(title) as Titles from first;
+-----------+---------------------+
| IDs       | Titles              |
+-----------+---------------------+
| 1,2,3,4,5 | aaaa,bbbb,cccc,eeee |
+-----------+---------------------+
1 row in set (0.00 sec)

coalesce()ただし、次のように関数をうまく使用して、素敵なプレースホルダーを追加できます。

mysql> select group_concat(id) as IDs, group_concat(coalesce(title,'NoValueSpecial')) as Titles from first;
+-----------+------------------------------------+
| IDs       | Titles                             |
+-----------+------------------------------------+
| 1,2,3,4,5 | aaaa,bbbb,cccc,NoValueSpecial,eeee |
+-----------+------------------------------------+
1 row in set (0.01 sec)

このcoalesce()関数は、複数の列または私が行ったように手動で入力した値のいずれかを調べ、欠落しているフィールドを見つけるための優れた識別子を返します。null 値は左から右に評価されます。

于 2012-08-22T09:24:27.800 に答える
1

GROUP CONCAT関数を使用して、PHP が後で parse_str を使用して解析できる文字列を作成できます

$sql = "SELECT distinct op.provider, g . * , GROUP_CONCAT(gp.`key` , '=' , gp.key_value SEPARATOR '&'), CONCAT(g.firstname, ' ', g.lastname) AS fullname
    FROM openid AS op
    INNER JOIN users AS g ON g.userid = op.userid
    INNER JOIN profiles AS gp ON gp.userid = op.userid
    WHERE op.openid =$openid";

プロファイル列の出力は、「key1=value1&key2=value2」のようになります。

于 2012-08-22T09:50:17.417 に答える