0

いくつかのテーブルを持つ MySQL データベースがあります。彼らはこのように見えます -

食卓:

+----------+------------+--------------+
| username | date       | food         |
+----------+------------+--------------+
| test123  | 2012-09-16 | rice         |
| test123  | 2012-09-16 | pizza        |
| test123  | 2012-09-16 | french fries |
| test123  | 2012-09-16 | burger       |
+----------+------------+--------------+

メインテーブル:

+----------+------------+----------------+---------------+-------------+-------------+
| username | date       | water_quantity | water_chilled | smoked_what | smoke_count |
+----------+------------+----------------+---------------+-------------+-------------+
| test123  | 2012-09-16 |              1 | no            | cigarettes  |          20 |
+----------+------------+----------------+---------------+-------------+-------------+

query を使用するSELECT * FROM main,food WHERE main.date=food.date;と、結果として 4 つの行が得られます。結果を 1 行で取得するにはどうすればよいでしょうか? 最終的に、結果を JSON にエンコードすると、次のようになります。

[
   {
      "username":"test123",
      "date":"2012-09-16",
      "water_quantity":"1",
      "water_chilled":"no",
      "smoked_what":"cigarettes",
      "smoke_count":"20",
       {
          "food":"rice",
          "food":"pizza",
          "food":"french fries",
          "food":"burger",                  
       },
   }
]

またはそれに似たもの。私はMySQLとデータベース全般、そしてJSONの初心者です。助けてくれてありがとう。

4

1 に答える 1

1
select m.*, GROUP_CONCAT(food SEPARATOR ',') AS food FROM main m INNER JOIN food f ON f.username = m.username and f.date = m.date;

もちろん、出力を制御するために選択するフィールドを変更することはできますが、それによって重複の問題が解決されます。

結果セット内のネストされた食品のリストについては、GROUP_CONCATを使用できます。

参照:http ://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

デモ用に再作成できるかどうかを確認します


デモ:

mysql> create table main (id INT NOT NULL AUTO_INCREMENT, username varchar(12) NOT NULL, date DATETIME, water_quality INT, water_chilled CHAR(3), smoked_what varchar(32), smoke_count INT, primary key (id));
Query OK, 0 rows affected (0.04 sec)

mysql> create table food (id INT NOT NULL AUTO_INCREMENT, username varchar(12) NOT NULL, date DATETIME, food varchar(32), primary key (id));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into food VALUES (1,'test123','2012-09-16','rice'),(2,'test123','2012-09-16','pizza'),(3,'test123','2012-09-16','french fries'),(4,'test123','2012-09-16','burger');Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> insert into main VALUES (1, 'test123', '2012-09-16', 1, 'no', 'cigarettes', 20);
Query OK, 1 row affected (0.00 sec)

mysql> select m.*, GROUP_CONCAT(food SEPARATOR ',') AS food FROM main m INNER JOIN food f ON f.username = m.username and f.date = m.date;
+----+----------+---------------------+---------------+---------------+-------------+-------------+----------------------------------+
| id | username | date                | water_quality | water_chilled | smoked_what | smoke_count | food |
+----+----------+---------------------+---------------+---------------+-------------+-------------+----------------------------------+
|  1 | test123  | 2012-09-16 00:00:00 |             1 | no            | cigarettes  |          20 | rice,pizza,french fries,burger   |
+----+----------+---------------------+---------------+---------------+-------------+-------------+----------------------------------+
1 row in set (0.00 sec)

mysql> 
于 2012-09-18T17:33:50.337 に答える