如何在 PHP MySQL 中将数据从搜索选项分配给 JSON 格式


how to assign data from search option to json format in php mysql

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,但如果 Kcome 是三方,我如何显示派对名称?

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

假设我们shows存储这些映射的表,这个 SQL 小提琴描述了如何生成输出。

首先要做的事。此表设计对于检索此类数据非常不利。我建议将其更改为类似的东西:

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 查询。您还必须要求整个表格来显示任何内容。对于更大的数据库来说,这将是自杀式的。

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

$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

但这只是一个纯粹的猜测,如果不了解桌子的整体结构和用途,我将无法说出更多。