繁体   English   中英

这个SQL查询根据先前查询的结果显示某些项目有什么问题?

[英]What is wrong with this SQL query to display certain items based on results from a prior query?

我正在尝试显示当前可用的汽车列表。 我对要完成的工作进行了巨大的查询,但未显示任何汽车,并且如果我使用var_dump()输出$available的值,则会给我以下输出:

array(2){[0] =>字符串(1)“ 1” [“ car_car_id”] =>字符串(1)“ 1”}

下面代码的输出是它回显test字符串文字3次。

SQL有什么问题?

  <?php
            $result = mysqli_query($con, "SELECT car_car_id FROM invoice_line WHERE '2017-06-12' > start_date AND '2017-06-12' < end_date OR '2017-06-12' > start_date AND '2017-06-14' < start_date OR '2017-06-12' < start_date AND '2017-06-14' > end_date OR '2017-06-12' != start_date OR '2017-06-14' != end_date OR '2017-06-12' != end_date OR '2017-06-14' != start_date");
            $available = mysqli_fetch_array($result);
            $product_array= mysqli_query($con, "SELECT * FROM car WHERE id != '$available'");
            while($result = mysqli_fetch_array($product_array)){
              echo 'test';
            }
            if (!empty($product_array)) {
              foreach($product_array as $key=>$value){
            ?>
              <div class="product-item">
                <form method="post" action="cars.php?action=add&code=<?php echo $product_array[$key]["id"]; ?>">
                <div><strong><?php echo $product_array[$key]["brand"]; ?> <?php echo $product_array[$key]["type"]; ?></strong></div>
                <div class="product-price"><?php echo "€".$product_array[$key]["price"]; ?></div>
                <div><input type="submit" value="toevoegen aan winkelwagen" class="btnAddAction" /></div>
                </form>
              </div>
            <?php
                }
            }
            ?>

预期表输出

Tl; dr:

在第二个SQL查询中使用NOT IN ()代替id != '$available' ,并分隔数组的值(例如,使用implode() )。

你的问题

sql有什么问题?

最大的值得注意的问题是第二个查询将从第一个查询中提取数组返回的数组直接放入第二个查询中。 这行:

$product_array= mysqli_query($con, "SELECT * FROM car WHERE id != '$available'");

替换$available可以将其概念化为:

$product_array= mysqli_query($con, "SELECT * FROM car WHERE id != 'Array'");

可能需要的条件是, 汽车表的id字段不等于汽车ID数组中的任何值(来自第一个查询)。 在SQL中,我们可以结合使用IN运算符和NOT 例如:

WHERE id NOT IN (3,4)

有多种使用PHP生成此代码的技术。 一种是使用implode()创建一个逗号分隔的字符串:

$available = array('car_car_id' => 3, 'car_car_id' => 4); //Sample
$ids = implode(', ', $available); //3,4 when $available has those elements
$product_array= mysqli_query($con, "SELECT * FROM car WHERE id NOT IN ($ids)");

重复值

您可能会注意到ID重复:

array(2){[0] =>字符串(1)“ 1” [“ car_car_id”] =>字符串(1)“ 1”}

那是因为对于传递给mysql_fetch_array()的 $ resulttype没有( 第二个 )参数,默认值为MYSQLI_BOTH

$available = mysqli_fetch_array($result);

要仅选择列的名称,请使用MYSQLI_ASSOC

$available = mysqli_fetch_array($result, MYSQLI_ASSOC);
// => Array ( [car_car_id] => 1 )

或仅对于数字索引,请使用MYSQLI_NUM

$available = mysqli_fetch_array($result, MYSQLI_NUM);
// => Array ( [0] => 1 )

WHERE子句中的第一个查询运算符

正如Yusef Hassan第一条评论中提到 ,需要考虑条件。 请记住, AND的优先级高于OR (请参阅MySQL运算符优先级 )。

之间有很大的区别:

SELECT car_car_id 
FROM invoice_line 
WHERE '2017-06-12' > start_date AND '2017-06-12' < end_date
 OR '2017-06-12' > start_date AND '2017-06-14' < start_date 
 OR '2017-06-12' < start_date AND '2017-06-14' > end_date 
 OR '2017-06-12' != start_date OR '2017-06-14' != end_date 
 OR '2017-06-12' != end_date OR '2017-06-14' != start_date

SELECT car_car_id 
FROM invoice_line 
WHERE ('2017-06-12' > start_date AND '2017-06-12' < end_date)
 OR ('2017-06-12' > start_date AND '2017-06-14' < start_date) 
 OR ('2017-06-12' < start_date AND '2017-06-14' > end_date) 
 OR ('2017-06-12' != start_date OR '2017-06-14' != end_date) 
 OR ('2017-06-12' != end_date OR '2017-06-14' != start_date)

后事态

可以通过在SQL中使用子查询(例如SELECT * FROM car WHERE id NOT IN (SELECT car_car_id FROM invoice_line WHERE ...) )或条件为car_car_id IS NULLLEFT JOIN来避免此处解决的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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