表在另一个里面

时间:2015-03-15 09:20:46

标签: php mysql select

我想公开计划我的旅行,以便其他人可以加入我。所以,我已经建立了一个PHP站点。

我有这张表:

trips:
+----+---------+------------+------------+-------------------------+
| id | title   | date_start | date_end   | marker_adress           |
+----+---------+------------+------------+-------------------------+
|  1 | Berlin  | 2015-07-10 | 2015-07-11 | Potsdamer Platz, Berlin |
|  2 | Hamburg | 2015-07-16 | 2015-07-18 | Jungfernstieg, Hamburg  |
+----+---------+------------+------------+-------------------------+

fellows:
+----+---------+---------------+
| id | trip_id | twittername   |
+----+---------+---------------+
|  1 |       1 | prtyengopls   |
|  2 |       1 | itobi_yt      |
|  3 |       1 | jessisadancer |
|  4 |       2 | jessisadancer |
|  5 |       2 | woelfch3n     |
+----+---------+---------------+

为了显示缘故,我想在一个查询中查询它们。 我如何查询数据库,所以我有这样的东西?(我知道,这是JSON,但它很好地展示了结构。)

{
    "id": 1,
    "date_start": "2015-07-10",
    "date_end": "2015-07-11",
    "marker_adress": "Potsdamer Platz, Berlin",
    "fellows": [
        {
            "id": 1,
            "twittername": "prtyengopls"
        },
        {
            "id": 2,
            "twittername": "itobi_yt"
        },
        {
            "id": 3,
            "twittername": "jessisadancer"
        }
    ]
}

2 个答案:

答案 0 :(得分:1)

首先你必须使用这样的LEFT JOIN

SELECT 
  t.id AS tripID, 
  t.title AS title, 
  t.date_start AS dateStart, 
  t.date_end AS dateEnd, 
  t.marker_address AS markerAddress,
  GROUP_CONCAT(DISTINCT CAST(f.id AS CHAR)) AS fellowID,
  GROUP_CONCAT(DISTINCT CAST(f.twittername AS CHAR)) AS twitterName
FROM trips t LEFT JOIN fellows f ON t.id = f.trip_id
GROUP BY t.id

通过使用此功能,您将获得每行的单行,并且您可以为每行循环fellowIDtwitterName,因为它将是comma分隔列表,如下所示:< / p>

fellowID: 1,2,3
twitterName: prtyengopls,itobi_yt,jessisadancer
  

编辑1:我得到了一个名为checked的新列,这是一个布尔值。   你可以更新你的查询,所以只有具有这个布尔值的旅行   显示切换?

SELECT 
  t.id AS tripID, 
  t.title AS title, 
  t.date_start AS dateStart, 
  t.date_end AS dateEnd, 
  t.marker_address AS markerAddress,
  GROUP_CONCAT(DISTINCT CAST(f.id AS CHAR)) AS fellowID,
  GROUP_CONCAT(DISTINCT CAST(f.twittername AS CHAR)) AS twitterName
FROM trips t INNER JOIN fellows f 
  ON t.id = f.trip_id AND t.checked = 1
GROUP BY t.id

答案 1 :(得分:0)

我不认为它可能像你在SQL中所期望的那样。只是回答你的问题并向你展示问题:你必须使用一个连接(左,内或某些东西......取决于你的数据库结构;如果可能的话我总是喜欢左连接)来获取所有信息只需一个查询: / p>

SELECT * FROM trips t LEFT JOIN fellows f on t.id = f.trip_id WHERE t.id = 1;

但是你总是会得到每一行的旅行信息,为此你必须在之后处理它。你将永远无法选择这样一个嵌套的结构,你将永远得到一个扁平的结构。 所以我建议将它分成两个这样的查询:

SELECT * FROM trips WHERE id = 1;
SELECT * FROM fellows WHERE trip_id = 1;

您之后也必须处理这些信息,但您只需从数据库中选择所需信息。

希望有所帮助。