繁体   English   中英

将3个查询合并到一个数组中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM