Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL在一个查询中多次选择检索嵌套数组_Php_Mysql - Fatal编程技术网

Php MySQL在一个查询中多次选择检索嵌套数组

Php MySQL在一个查询中多次选择检索嵌套数组,php,mysql,Php,Mysql,[更新] 我尝试从一个表中选择数据,但尝试以不同的顺序获取它们 SELECT * FROM ( SELECT * FROM videos ORDER BY timestamp DESC ) mostrecent UNION ALL SELECT * FROM ( SELECT * FROM videos ORDER BY timestamp ASC ) oldest 现在,这将以不同的顺序检索记录。最新的视频和最旧的视频 foreach($table as $key=>$

[更新]

我尝试从一个表中选择数据,但尝试以不同的顺序获取它们

SELECT * FROM 
(
  SELECT * FROM videos ORDER BY timestamp DESC
) mostrecent

UNION ALL

SELECT * FROM
( 
  SELECT * FROM videos ORDER BY timestamp ASC
) oldest
现在,这将以不同的顺序检索记录。最新的视频和最旧的视频

foreach($table as $key=>$value)
{
$row_tmb[$key] = $value;
}
$array[] = $row_tmb;

打印数据时

print_r($array);
我明白了

Array ( [0] => Array ( [vid] => 1 [title] => title1 [timestamp] => newer) 
        [1] => Array ( [vid] => 2 [title] => title2 [timestamp] => older
        //from second select...
        [2] => Array ( [vid] => 2 [title] => title2 [timestamp] => older
        [3] => Array ( [vid] => 1 [title] => title1 [timestamp] => newer
)
我想要

Array('newest' => Array ( 
        [0] => Array ( [vid] => 1 [title] => title1 [timestamp] => newer) 
        [1] => Array ( [vid] => 2 [title] => title2 [timestamp] => older))
        //from second select...
Array('oldest' => Array (
        [0] => Array ( [vid] => 2 [title] => title2 [timestamp] => older
        [1] => Array ( [vid] => 1 [title] => title1 [timestamp] => newer))

可以在select语句中使用如下外部查询:

select
    *
from
    (
        SELECT
            'Newest',col1,col2,etc
        FROM
            (
            SELECT 
                * 
            FROM 
                videos 
            ORDER BY 
                timestamp DESC
            )mostrecent
        UNION ALL
        SELECT
            'Oldest',col1,col2,etc
        FROM
            (
            SELECT 
                * 
            FROM 
                videos 
            ORDER BY 
                timestamp DESC
            )oldest
    ) someTable
order by
    1 asc
(
    SELECT *, 'newest' AS source, timestamp AS sortColumn
    FROM videos
)
UNION ALL
(
    SELECT *, 'oldest' AS source, -timestamp AS sortColumn
    FROM videos
)
ORDER BY sortColumn DESC
(
    SELECT *, 'newest' AS source, timestamp AS sortColumn
    FROM videos
    ORDER BY timestamp DESC
    LIMIT 100
)
UNION ALL
(
    SELECT *, 'oldest' AS source, nbVotes AS sortColumn
    FROM videos
    ORDER BY timestamp ASC
    LIMIT 100
)
ORDER BY sortColumn DESC
然后,这将首先按最新/最旧的结果排序,然后按您拥有的结果排序

这不会像显示所需的输出那样为您提供两个数组,但它将为您提供与您所需相同的内容,除了在一个数组中。不过,您可以简单地检查PHP代码中的第一列,然后将其放入正确的数组中,以获得所需的嵌套数组


编辑:将别名添加到派生表中。不要吹毛求疵,但在你写“甚至都不起作用”的同时,你本可以找出遗漏并进行有效的查询。来吧,伙计,这里的答案是为了帮助你,而不是为了帮你完成工作:)

我知道这是一个理想的答案,但至少我不必再查询两次。 因为我知道每次选择只需要两条记录

$newest = array($videos[0], $videos[1]);
$oldest = array($videos[2], $videos[3]);
现在,当检索到html时,这甚至更容易处理…

清楚地指出:对单个SELECT语句使用ORDER BY并不意味着行在最终结果中的显示顺序,因为默认情况下,UNION会生成一组无序的行

我建议您使用一个简单的查询:

SELECT *
FROM videos
ORDER BY timestamp DESC
在PHP数组中获取数据,然后使用PHP代码复制它,并根据需要组合它。这是一些使用
mysqli
的示例代码。使用
PDO
与此类似:

// You should add a LIMIT to the query or it will take a lot of time and consume
// a lot of memory when the table gets bigger (several thousand rows)
$query  = 'SELECT * FROM videos ORDER BY timestamp DESC';
$result = mysqli_query($connection, $query);

// Retrieve the data
$data = array();
while ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}

// Use the retrieved data to get the combined result
$array = array(
    'newest' => $data,
    'oldest' => array_reverse($data),
);
更新:

假设列
timestamp
包含一个整数值(时间戳),您可以通过以下查询从
MySQL
获得相同的结果:

select
    *
from
    (
        SELECT
            'Newest',col1,col2,etc
        FROM
            (
            SELECT 
                * 
            FROM 
                videos 
            ORDER BY 
                timestamp DESC
            )mostrecent
        UNION ALL
        SELECT
            'Oldest',col1,col2,etc
        FROM
            (
            SELECT 
                * 
            FROM 
                videos 
            ORDER BY 
                timestamp DESC
            )oldest
    ) someTable
order by
    1 asc
(
    SELECT *, 'newest' AS source, timestamp AS sortColumn
    FROM videos
)
UNION ALL
(
    SELECT *, 'oldest' AS source, -timestamp AS sortColumn
    FROM videos
)
ORDER BY sortColumn DESC
(
    SELECT *, 'newest' AS source, timestamp AS sortColumn
    FROM videos
    ORDER BY timestamp DESC
    LIMIT 100
)
UNION ALL
(
    SELECT *, 'oldest' AS source, nbVotes AS sortColumn
    FROM videos
    ORDER BY timestamp ASC
    LIMIT 100
)
ORDER BY sortColumn DESC
如果
时间戳
列不是整数值,而是
日期
,则使用
FROM_UNIXTIME(时间戳)作为排序列
。其思想是计算一个可用于最终排序的值(在
UNION
级别),并将其存储在新列
sortColumn

PHP中使用
source
列来了解每条记录所属的组(最新记录与最旧记录)

备注:对于中型和大型表(数千行或更多行),它将运行缓慢,因为它无法使用索引。对于这种大小的表,无论如何选择所有记录都没有多大意义。您可能会这样写:

select
    *
from
    (
        SELECT
            'Newest',col1,col2,etc
        FROM
            (
            SELECT 
                * 
            FROM 
                videos 
            ORDER BY 
                timestamp DESC
            )mostrecent
        UNION ALL
        SELECT
            'Oldest',col1,col2,etc
        FROM
            (
            SELECT 
                * 
            FROM 
                videos 
            ORDER BY 
                timestamp DESC
            )oldest
    ) someTable
order by
    1 asc
(
    SELECT *, 'newest' AS source, timestamp AS sortColumn
    FROM videos
)
UNION ALL
(
    SELECT *, 'oldest' AS source, -timestamp AS sortColumn
    FROM videos
)
ORDER BY sortColumn DESC
(
    SELECT *, 'newest' AS source, timestamp AS sortColumn
    FROM videos
    ORDER BY timestamp DESC
    LIMIT 100
)
UNION ALL
(
    SELECT *, 'oldest' AS source, nbVotes AS sortColumn
    FROM videos
    ORDER BY timestamp ASC
    LIMIT 100
)
ORDER BY sortColumn DESC

选择最近的100行和最旧的100行。最后的结果从按
时间戳排序的最新记录开始(首先是最新的),然后是按他们收到的投票数排序的最旧记录(列
nbvoces
),递减(我假设没有视频的投票数超过13亿).

您的问题不清楚。请解释清楚。我希望这将有助于澄清您是否没有限制条款?我可能需要限制每个selecttoo@MustafaMJalal:是的。给定的查询没有问题,它说每个派生表都必须有自己的表alias@MustafaMJalal:看来已经修好了。@MustafaMJalal:那你到底需要什么?如果你不解释你的实际问题,我们怎么可能回答你的问题呢,
UNION
不保留由它组合的
SELECT
s生成的行的顺序,也不保证第一个
SELECT
生成的行在第二个
SELECT
生成的行之前。当与
限制
组合使用时,在
选择
查询上使用
排序很有用。为了实现对
UNION
ed结果集的排序,您必须将
SELECT
s括在括号中,并在
UNION
级别添加
order BY
子句a。为了保持行的顺序,您可以选择一个额外的计算列,其中包含一个正确构建的表达式。我用一个只使用
SQL
的解决方案更新了答案。