[英]combining 3 queries into one array
有一个更好的方法吗? 我有3个不同的查询,想要将它们全部放入一个数组中。 由于我不能直接按照查询的确切顺序对其进行排序,因此必须在3个单独的查询中进行查询(除非您知道在查询中执行此查询的方法)。
然后,我只需要创建单独的临时数组,以便可以执行foreach循环以使用array_push()函数。 当然,还有比这大声笑更好的方法。
$sql = "SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and
(
(priority = 'emergency' and date > DATE_SUB(NOW(), INTERVAL 20 DAY))
or
(priority = 'urgent' and date > DATE_SUB(NOW(), INTERVAL 40 DAY))
)
ORDER BY priority DESC, prayers.date DESC";
$sql2 = "SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and priority = 'normal'
and date > DATE_SUB(NOW(), INTERVAL 60 DAY)
ORDER BY prayers.date DESC";
$sql3 = "SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and priority = 'long_term'
ORDER BY prayers.date DESC";
$_SESSION['aprayers'] = send_query($sql);
$rows2 = array();
$rows2 = send_query($sql2);
foreach ($rows2 as $row) {
array_push($_SESSION['aprayers'],$row);
}
$rows3 = array();
$rows3 = send_query($sql3);
foreach ($rows3 as $row) {
array_push($_SESSION['aprayers'],$row);
}
我相信您应该能够通过组合条件并使用CASE对优先级进行排序而无需使用UNION就可以在一个查询中执行此操作。 我真的不确定这样做的性能如何与UNION解决方案相提并论,但是就其价值而言,它消除了代码中的一些冗余。
$sql = "SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and
(
(priority = 'emergency' and date > DATE_SUB(NOW(), INTERVAL 20 DAY))
or
(priority = 'urgent' and date > DATE_SUB(NOW(), INTERVAL 40 DAY))
or
(priority = 'normal' and date > DATE_SUB(NOW(), INTERVAL 60 DAY))
or
priority = 'long_term'
)
ORDER BY
CASE priority
WHEN 'emergency' THEN 1
WHEN 'urgent' THEN 2
WHEN 'normal' THEN 3
WHEN 'long_term' THEN 4
END, prayers.date DESC";
$sql_queries = array($sql1, $sql2, $sql3);
$_SESSION['aprayers'] = array();
foreach($sql_queries as $sql_query)
{
$_SESSION['aprayers'] = array_merge($_SESSION['aprayers'], send_query($sql_query));
}
您可以使用UNION语法将它们组合为一个。
https://dev.mysql.com/doc/refman/5.0/en/union.html
示例(更新):
(SELECT prayers.*, 1 as order
FROM prayers AS p
LEFT JOIN prayed_for AS f USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and
(
(priority = 'emergency' and date > DATE_SUB(NOW(), INTERVAL 20 DAY))
or
(priority = 'urgent' and date > DATE_SUB(NOW(), INTERVAL 40 DAY))
)
) UNION (
SELECT prayers.*, 2 as order
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and priority = 'normal'
and date > DATE_SUB(NOW(), INTERVAL 60 DAY)
) UNION (
SELECT prayers.*, 3 as order
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and priority = 'long_term'
) ORDER BY order, priority, p.date
这是所有查询之一:
SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and
(
(priority = 'emergency' and date > DATE_SUB(NOW(), INTERVAL 20 DAY))
or
(priority = 'urgent' and date > DATE_SUB(NOW(), INTERVAL 40 DAY))
)
ORDER BY priority DESC, prayers.date DESC
union all
SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and priority = 'normal'
and date > DATE_SUB(NOW(), INTERVAL 60 DAY)
ORDER BY prayers.date DESC
union all
SELECT prayers.*
FROM prayers
LEFT JOIN prayed_for USING (postid)
WHERE prayed_for.username = '" . $_SESSION['user']['username'] . "'
and prayers.type = 'prayer'
and prayers.privacy != 'hidden'
and priority = 'long_term'
ORDER BY prayers.date DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.