如何将数据从搜索选项分配到php mysql中的json格式

时间:2016-03-01 11:24:59

标签: php mysql arrays json

My Mysql table is in following format and with json format for shows_id 

id |  assign_id  |  rights    | party      |shows_id
---+-------------+------------+------------+---------
1  |4            |  12        | xyz        | ["2","3","13","14"]
2  |4            |   5        | xyz        | ["2","3","13","59"]
3  |6            |  14        | abc        | ["56","57","59","60"]
4  |6            |  5         | abc        | ["56","57","59","60"]
5  |7            |  12        | def        | ["2","41","42","54"]
6  |7            |  5         | def        | ["2","41","42","59"]

我希望以表格格式输出:
         搜索结果对于权利5

     | party                |shows_id
-----+----------------------+----------
     | xyz  ,def            | 2
     | xyz                  | 3
     | xyz                  |13
     | xyz ,def,abc         |59
     | abc                  | 56         
     | abc                  | 57
     | abc                  | 59
     | abc                  | 60
     | def                  | 41
     | def                  | 42

我在数组中获得了shows_id的所有ID,但是如果Kcomes在三方中,我如何能够显示派对名称?

2 个答案:

答案 0 :(得分:0)

使用提供的设计,无法获得上述输出,因为shows_id存储为(json)字符串(它也不是很好的设计)。我建议创建一个包含partyshow_id列的新表来存储这些映射,然后,我们可以查询该表以生成所需的输出。

假设我们有shows表来存储这些映射,this SQL Fiddle描述了如何生成输出。

答案 1 :(得分:0)

首先要做的事情。此表设计非常糟糕用于检索此类数据。我建议将其更改为:

party:
  ID
  assign_id
  rights
  party

party_shows:
  party_id
  shows_id

然后使用以下查询很容易检索数据:

SELECT GROUP_CONCAT(DISTINCT party.party ORDER BY party.party SEPARATOR ','), party_shows.shows_id FROM party INNER JOIN party_shows ON party.id=party_shows.party_id GROUP BY party_shows.shows_id

您还可以查询特定的shows_id。

在您的设计中,您无法使用纯粹的' MySQL查询。你还需要一个WHOLE表来显示任何东西。对于更大的数据库,这将是自杀。

但是 - 有可能根据您的意愿准备结果。它看起来类似于以下伪代码:

$pdo = getDbConnection(); //Let's assume you retrieve your DB connection here, as PDO
$sql = "SELECT * FROM party";
$results = $pdo->query($sql);
$return = array();
foreach ($results as $result) {
    $shows = json_decode($result['shows_id'], true);
    foreach ($shows as $show_id) {
        if (empty($return[$show_id])) {
            $return[$show_id] = array($result['party']);
        } else {
            $return[$show_id][] = $result['party'];
        }
    }
}
foreach ($return as &$return_row) {
    $return_row = implode(',', array_unique($return_row));
}

现在,您有$return表,其中每一行都是带有派对名称的字符串。 $return数组的键是显示ID,因此您可以通过它进一步过滤。

我必须再说一次:这不是一个好方法。但这是有可能的。

作为最后一点:您的表结构(表中的重复方名称)表明整个结构需要进一步解耦。作为一般规则 - 每个实体(派对,用户,派对节目)应显示为一行。所以你应该有适当的联接表的派对,受让人,演出等表。也许是这样的:

assignee:
    id
    name
assignee_party:
    assignee_id
    party_id
    rights
party:
    id
    party
party_shows:
    party_id
    show_id

但这只是一个纯粹的猜测,在没有知道整个结构和目的的情况下,我无法告诉更多。