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
的解决方案更新了答案。