【问题标题】:i nf data table structure from json data来自 json 数据的 i nf 数据表结构
【发布时间】:2016-06-09 04:37:23
【问题描述】:

我有一个类似的数据库(mysql)表

id |  party  |  rights    | m_id
---+---------+------------+---------
9  |abc      | 3,5,6      | ["12,","15,"6"]
20 |xyz      |  5,2       | ["6,","2,"9","12"]
21 |xyz 1    |  5,2       | ["6,","9,"12"]

现在我想以这种方式制作我的桌子 权利 5 的搜索结果是 ["12,","15,"6"] ["6,","2,"12"] ["6,","9,"12"]

12 | abc,xyz,xyz1 |

15 | abc|

6 | abc,xyz,xyz1 |

9 | xyz,xyz1 |

【问题讨论】:

  • "等属于party表" - 狂猜模式:这里涉及到sql查询?如果这很重要,请将其添加到您的问题中。如果没有,请提供您在 php 脚本中可用的实际数据(结构)。
  • 我上传了@VolkerK 表的图片
  • 仍然令人困惑。首先你写“Right 5 contains three show id”,然后“For eg: output right 9 : party2 ,party3.”。请详细说明。我可以进入疯狂的猜测模式:您正在寻找所有同时具有 a) 5 列中的行 rights 9 字段 shows_id?但这会立即让我建议database normalization ;-)
  • 我冒昧地重写了您的问题(或我目前认为的问题......)。请填写缺少的部分....如果我误解了问题,请完全编辑它(无论如何它都是猜测工作;-))。无论如何,请从该编辑中获取一件事:请,请,请以可用的形式发布现有/示例数据。例如。您可以将问题中的表格直接粘贴到sqlfiddle.com的“Text to DDL”工具中->对问题感兴趣的人可以轻松设置测试环境。与 var_export($x); 相同,而不是 var_dump($x)。
  • rights 5 会显示三个json show_id ["12","15","6"] ["6","9","11"] ["6","13", "15","2","4","9"] ...我想要我的输出:shows_id 12:Percept shows_id 15:Percept,Tata Sky

标签: php mysql arrays json


【解决方案1】:

我将在下面给出一个示例,以便您可以按照自己的方式编写,

如果你有下面的表格

id | name    
1  | a,b,c    
2  | b

和这样的预期输出

id | name    
1  | a    
1  | b    
1  | c    
2  | b

然后按照以下解决方案

如果您可以创建一个数字表,其中包含从 1 到要拆分的最大字段的数字,您可以使用如下解决方案:

select
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) name
from
  numbers inner join tablename
  on CHAR_LENGTH(tablename.name)
     -CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1
order by
  id, n

请看小提琴here.

如果你不能创建表,那么解决方法可以是这样的:

select
  tablename.id,
  SUBSTRING_INDEX(SUBSTRING_INDEX(tablename.name, ',', numbers.n), ',', -1) name
from
  (select 1 n union all
   select 2 union all select 3 union all
   select 4 union all select 5) numbers INNER JOIN tablename
  on CHAR_LENGTH(tablename.name)
     -CHAR_LENGTH(REPLACE(tablename.name, ',', ''))>=numbers.n-1
order by
  id, n

一个示例小提琴是here.

【讨论】:

    【解决方案2】:

    让我们从我相信你已经拥有的开始。这是sscce。如果您调整 mysql 凭据,它应该在您的系统上运行,只创建一个临时 MySQL 表。它使用PDO 访问 MySQL 服务器。 实际使用哪个 API 并不重要(即只要另一个 API 是 mysqli,因为 mysql_* 函数 are depreacted ;-))

    <?php
    $pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly', array(
        PDO::ATTR_EMULATE_PREPARES=>false,
        PDO::MYSQL_ATTR_DIRECT_QUERY=>false,
        PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION
    ));
    setup($pdo);
    
    $statement = $pdo->prepare('
        SELECT
            *
        FROM
            soFoo
        WHERE
            FIND_IN_SET(:right, rights)
    ');
    
    $statement->execute( array(':right'=>5) );
    
    /* in one way or another you have a loop where you fetch the records
    having '5' in the `rights` field
    */
    foreach( $statement as $row ) {
        echo $row['party'], ' ', $row['show_ids'], "\r\n";
    }
    
    
    function setup($pdo) {
        $pdo->exec('
            CREATE TEMPORARY TABLE soFoo
        (`id` int, `party` varchar(9), `exc` varchar(13), `rights` varchar(5), `show_ids` varchar(27))
       ');
      $pdo->exec( <<< eos
            INSERT INTO soFoo
                (`id`, `party`, `exc`, `rights`, `show_ids`)
            VALUES
                (9, 'Percept', 'Non-Exclusive', '3,5,6', '["12,","15,"6"]'),
                (20, 'Tata Sky', 'Non-Exclusive', '5,4,', '["6,","9,"11"]'),
                (21, 'Tata Sky', 'Exclusive', '5,4', '["6,","13","15,"2","4","9"]'),
                (22, 'Simbiotic', 'Exclusive', '6,2', '["12,","15,"1","6","7","8"]')
    eos
        );
    }
    

    打印出来

    Percept ["12,","15,"6"]
    Tata Sky ["6,","9,"11"]
    Tata Sky ["6,","13","15,"2","4","9"]
    

    并且是(据我理解的问题)就您已经得到的而言。

    现在让我们decode the JSON array 并检查whether it contains 元素9。如果它确实将当前行的信息添加到名为$parties的数组中

    $parties = array();
    /* in one way or another you have a loop where you fetch the records
    having '5' in the `rights` field
    */
    foreach( $statement as $row ) {
        $ids = json_decode($row['show_ids'], true);
        if ( in_array('9', $ids) ) {
            $parties[$row['id']] = $row['party'];
        }
    }
    var_export($parties);
    

    打印

    array (
      20 => 'Tata Sky',
      21 => 'Tata Sky',
    )
    

    但是……从关系数据库的角度来看,这是……次优的。
    FIND_IN_SET 子句阻碍 MySQL 有效地使用索引;您正在单个字段搜索(复合)数据。数据库服务器实现可以提高性能的能力令人惊叹;但它有限制。
    而且您还将可能不必要的数据从 MySQL 服务器传输到 php 实例(那些在 rights 中具有 5 但在 show_ids 中没有 9 的记录)。如果可能,应该避免这种情况。网络/网络堆栈速度很快并且可以优化,RAM 很便宜……但同样存在限制。

    所以,我建议您一方面查看Database normalization 和/或另一方面查看document-oriented databases

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2022-11-24
      • 1970-01-01
      相关资源
      最近更新 更多