【问题标题】:Run 2 queries together but execute separately一起运行 2 个查询,但分别执行
【发布时间】:2016-12-25 00:53:24
【问题描述】:

我目前有 2 个单独的查询需要一起运行,但要单独执行,我想知道这样做的最佳做法是什么。

我有一个查询,每次在管理页面中添加餐厅时都会动态打印出餐厅,并且我有一个查询可以确定餐厅是营业还是关闭。我认为通过执行 2 个单独的查询然后将打开时间回显保存到一个变量中并将这个变量放入循环中,这将很简单,但是,这似乎不起作用。通过不工作,我的意思是调用了错误的 id,因为打开的 hrs 查询是在动态打印输出查询之前,而当它在查询工作计划之后,但是我的回显/打印输出变量不起作用。我很震惊,不知道如何前进。

打开人力资源查询

$query = mysqli_query($dbc, "SELECT * FROM Opening_hrs 
  WHERE Restaurant_ID='$rest_id' AND Day_of_week = DATE_FORMAT(NOW(), '%w')
  AND CURTIME() BETWEEN Open_time AND Closing_time");

$run_qu = $dbc->query($query);

if($run_qu->num_rows>0){
    while($row_qu=$run_qu->fetch_assoc()){
        $message= "open" .$row_qu["Open_time"]."</br>";
    }
} else {
    $message=$message. "close".$row_qu["Closing_time"]."</br>";
}

动态查询

$sql = mysqli_query($dbc, "SELECT Rest_Details.Resturant_ID,  Rest_Details.Resturant_name,,Delivery_Pcode.Pcode 
 FROM Rest_Details INNER JOIN Delivery_Pcode
 ON Delivery_Pcode.Restaurant_ID=Rest_Details.Resturant_ID
 WHERE Delivery_Pcode.Pcode LIKE '%" . $pcode . "%'") or die("could not search!");
echo var_dump($sql);

$count = mysqli_num_rows($sql);
if ($count === 0) {
    $output = '<b>we dont deliver to ' . $pcode . '</b></br>';
} else {
    $i = 1;
}
while ($row_prods = mysqli_fetch_array($sql)) {
    $rest_id = $row_prods['Resturant_ID'];
    $rest_name = $row_prods['Resturant_name'];

    $output = $output . '<div id="products">' .
            ' <p id="rest_name">' . $rest_name . '</p>' .
            '<p> '.$message.' </p>' .;
    $i++;
}
}

【问题讨论】:

  • 您可以只在动态查询中 LEFT JOINOpening_hrs 并返回所有其他餐厅信息的营业时间。
  • 您的代码有几个问题。在Opening hr query 中,当$row_qu 未设置时,您将在else 子句中访问$row_qu["Closing_time"]。动态查询最后多了一个}
  • 我不明白这些应该如何协同工作。营业时间查询仅针对单个餐厅,而动态查询针对所有餐厅。为什么要将同一餐厅的营业时间放在所有餐厅的结果中?
  • 由于您使用的是mysqli,因此您应该使用准备好的查询,而不是直接将变量替换到查询中。
  • @Barmar 也许我没有正确解释。我很抱歉,开放时间查询是为了显示每家餐厅的营业时间和关闭时间,这就是我希望它在循环中的原因。所以循环输出餐厅名称、id 和营业时间

标签: php mysql


【解决方案1】:

你应该加入这两个查询:

SELECT
    Rest_Details.Resturant_ID,
    Rest_Details.Resturant_name,
    Delivery_Pcode.Pcode,
    Opening_hrs.Open_time,
    Opening_hrs.Closing_time
FROM Rest_Details
JOIN Deliver_Pcode ON Delivery_Pcode.Restaurant_ID=Rest_Details.Restaurant_ID
LEFT JOIN Opening_hrs ON Opening_Hrs.Restaurant_ID=Rest_Details.Restaurang_ID
    AND Day_of_week = WEEKDAY(NOW()) AND CURTIME() BETWEEN Open_time AND Closing_time
WHERE Delivery_Pcode.Pcode LIKE '%$pcode%'

因为是LEFT JOINOpen_timeClosing_time在餐厅营业时填写,否则为NULL。所以显示结果的 PHP 可以检查这个:

while ($row_prods = mysqli_fetch_array($sql)) {
    $rest_id = $row_prods['Resturant_ID'];
    $rest_name = $row_prods['Resturant_name'];

    $output .= '<div id="products">' .
            ' <p id="rest_name">' . $rest_name . '</p>';
    if ($row_prods['Open_time']) {
        $output .= '<p> open ' . $row_prods['Open_time'] . ' close ' . $row_prods['Close_time'];
    }
    $output .= "</div>";
    $i++;
}

【讨论】:

  • 抱歉只看到这个。谢谢你。我会尝试按照这个来解决我的问题。但是这个确切的答案引起了我将解决的许多问题。感谢您的宝贵时间
【解决方案2】:

如果您想获得将在一定范围内送餐的所有餐厅及其营业时间的列表,那么您可以使用以下查询:

$sql = '
SELECT
    Rest_Details.Resturant_ID,
    Rest_Details.Resturant_name,
    Delivery_Pcode.Pcode,
    EXISTS(
        SELECT *
        FROM Opening_hrs
        WHERE
            Restaurant_ID=' . $rest_id . ' AND
            Day_of_week = DATE_FORMAT(NOW(), "%w") AND
            CURTIME() BETWEEN Open_time AND Closing_time
    ) as isOpen
FROM Rest_Details INNER JOIN Delivery_Pcode
ON Delivery_Pcode.Restaurant_ID=Rest_Details.Resturant_ID
WHERE Delivery_Pcode.Pcode LIKE "%' . $pcode . '%"
';

如果有一行或多行匹配指定的查询,Mysql exist() 将返回 1,否则返回 0as isOpen 将使该值在名称为 isOpen 的列中可访问。

【讨论】:

  • 请重新测试。如果出现错误或问题,请发布错误消息或问题描述。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
  • 2021-01-19
  • 2016-01-05
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多