【问题标题】:php sort data according to 2nd tablephp根据第二张表对数据进行排序
【发布时间】:2016-04-14 10:47:21
【问题描述】:

我有两个表:表 1 和表 2

我需要对数据进行排序,如表格视图所示。

我已经服用了:

foreach($Table1 as $row1 )
{
    foreach($Table2 as $row2 )
    {
          if($row1->id == $row2->selected_id)
          {
                  show??
          }
    }

}

请不要担心查询:真正的问题是:

只有一个问题:表1是由20个不同的函数生成的,并收集到表1中。用户通过选择来选择他们想要查看的。所以,如果总共有 7 行并且用户选择了 3,那么数据将被排序,显示在第一行选择 3 行,然后在 3 行之后休息。

这是正确的做法吗?还是有更简单的方法 我正在使用 MySQL

请帮助任何人?

【问题讨论】:

    标签: php mysql for-loop


    【解决方案1】:

    根据您的additional question,您似乎不想为此使用 MySQL,并且您的用户选择实际上是一个类似这样的数组:

    $filter = [ 3, 4, 7, 8 ];
    

    使用array_reduce 过滤原始$Table1 数组。使用此方法,您可以获得一个数组 ($filtered),其中元素 0 中包含用户选择,元素 1 中包含其他值:

    $filtered = array_reduce
    (
        $Table1,
        function( $carry, $item ) use( $filter )
        {
            $index = !in_array( $item['id'], $filter );
            $carry[$index][] = $item;
            return $carry;
        },
        [ [], [] ]
    );
    

    然后,将$filtered 数据与call_user_func_array 合并:

    $result = call_user_func_array( 'array_merge', $filtered );
    

    结果:

    Array
    (
        [0] => Array
            (
                [id] => 3
                [name] => C
            )
        [1] => Array
            (
                [id] => 4
                [name] => D
            )
        [2] => Array
            (
                [id] => 7
                [name] => G
            )
        [3] => Array
            (
                [id] => 8
                [name] => H
            )
        [4] => Array
            (
                [id] => 1
                [name] => A
            )
        [5] => Array
            (
                [id] => 2
                [name] => B
            )
        [6] => Array
            (
                [id] => 5
                [name] => E
            )
        [7] => Array
            (
                [id] => 6
                [name] => F
            )
    )
    

    【讨论】:

    • 这似乎是正确的,但似乎无法弄清楚如何实现它。你能告诉我一个工作的例子吗???
    • 以上是一个工作示例。 $Table1 是您的原始数组,$filter 是您的用户选择,$result 是结果数组。
    【解决方案2】:

    您可以在单个查询中实现此目的,之后无需遍历两个表

       Select t1.id, t1.name
         From Table1 t1
    Left Join Table2 t2 On t1.id = t2.selected_id
     Order By t2.id, t1.id
    

    【讨论】:

    • 只有一个问题:表1是由20个不同的函数生成的,汇集到表1中,用户通过选择来选择他们想要查看的。因此,如果总共有 7 行并且用户选择了 3,那么数据将被排序,显示在第一行选择 3 行,然后在 3 行之后休息。
    【解决方案3】:

    您可以进行以下查询。

    Select t1.* from table2 t2 inner join table1 t1 on t2.selected_id = t1.id order by t2.id
    UNION
    Select t1.* from table1 t1 where t1.id NOT IN ( select t2.id from table2 t2 inner join table1 t1 on t2.selected_id = t1.id ) order by t1.id
    

    【讨论】:

    • 只有一个问题:表1是由20个不同的函数生成的,汇集到表1中,用户通过选择来选择他们想要查看的。因此,如果总共有 7 行并且用户选择了 3,那么数据将被排序,显示在第一行选择 3 行,然后在 3 行之后休息。
    【解决方案4】:

    您可以使用有效的 SQL 查询来立即获取最终表,如下所示:

    查询1:

    SELECT t2.id, t1.name
    FROM t2
    INNER JOIN t1
    ON t2.id=t1.id;
    

    这将输出前 4 行,然后:

    查询2:

    SELECT id, name
    FROM t1
    WHERE id NOT IN (SELECT id FROM t2);
    

    会输出最后 4 行,然后只做一个 UNION:

    最终查询:

    Query1 UNION Query2;
    

    明确:

    (SELECT t2.id, t2.name
            FROM t2
            INNER JOIN t1
            ON t2.id=t1.id)
    UNION
    (SELECT id, name
            FROM t1
            WHERE id NOT IN (SELECT id FROM t2));
    

    更紧凑一点:

    (SELECT t2.*
                FROM t2
                INNER JOIN t1
                ON t2.id=t1.id)
        UNION
        (SELECT *
                FROM t1
                WHERE id NOT IN (SELECT id FROM t2));
    

    【讨论】:

    • 只有一个问题:表1是由20个不同的函数生成的,汇集到表1中,用户通过选择来选择他们想要查看的。因此,如果总共有 7 行并且用户选择了 3,那么数据将被排序,显示在第一行选择 3 行,然后在 3 行之后休息。
    • 不是先排序选定的行,然后再排序您想要的其余行吗?
    • 没错!但是不能通过join来完成:因为表1不是mySQL表。但是 table2 是 mySQL 中的一个表,它是从 table1 收集的,带有 id
    【解决方案5】:

    您可以在查询中使用:Order By field()。在 field() 函数中,第二个表数据以字符串逗号分隔。

    【讨论】:

      【解决方案6】:

      您可以使用 Union 先显示选定的行,然后再显示未选定的行,结合 (where in ) 和 (where not in) 子句接下来是查询:

      (select t1.id, t1.name from table1 t1 where t1.id 
      in (select t2.selected_id from table2 t2)) union
      (select t1.id , t1.name from table1 t1 where t1.id 
      not in (select t2.selected_id from table2 t2));
      

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-20
        • 2021-04-23
        • 1970-01-01
        • 2018-08-17
        • 1970-01-01
        相关资源
        最近更新 更多