多个选择语句

时间:2013-12-20 18:18:37

标签: php sql

我正在尝试创建一个项目列表,其中列表中的每四个项目都是来自纽约和On Sale的项目。列表中的其他项目是来自纽约的项目,无论它们是否在销售。

如何正确使用两个select语句将列表分解为我想要的顺序?以下是我现在正在使用的内容。它会创建一个段落列表,但不了解变量$article$article2是什么。

<ul>

<?
    $sort = id;
    $sql = "SELECT * FROM `Catalog` WHERE state = 'New York' and in_stock = 'yes' ORDER BY $sort";
    $result = mysql_query($sql);

    $sql2 = "SELECT * FROM `Catalog` WHERE state = 'New York' and sale_item = 'yes' ORDER BY $sort ";
    $result2 = mysql_query($sql2);

    $i = 0;

    while ( $article = mysql_fetch_array($result) || $article2 = mysql_fetch_array($result2) ) { 

        if ($i == 0) {
            echo '<li>This item number is on sale:'.article2[id]. '</li>';
                $i++;       
        } else if ($i == 3) {
                echo '<li>This item number is regular price'.article[id]. '</li>';
                $i = 0;
        } else {
            echo '<li>This item number is regular price'.article[id].'</li>';
            $i++;
        }
    }
    ?>  

</ul>

基于戴夫的建议,我正在尝试这种方式。但是php仍然不知道如何解释$ itemsOnSale或$ items。

<ul>
<?   
$items = array();
$itemsOnSale = array();
$sql = "SELECT * FROM `Catalog` WHERE state = 'New York' AND in_stock = 'yes' ORDER BY $sort";
$result = mysql_query($sql);
while ( $row = mysql_fetch_assoc($result) ) {

    if ( $row['sale_item'] == 'yes' ) {
        $itemsOnSale[] = $row;  
    } else {
        $items[] = $row;
    }

        if ($i == 0) {
               echo '<li>This item number is on sale:'.$itemsOnSale[id]. '</li>';
               $i++;       
        } else if ($i == 3) {
             echo '<li>This item number is regular price'.$items[id]. '</li>';
             $i = 0;
        } else {
             echo '<li>This item number is regular price'.$items[id].'</li>';
             $i++;
        }

}

  ?>
</ul>

3 个答案:

答案 0 :(得分:1)

更好的方法是在单个查询中提取所有项目,将它们存储在单独的数组中,然后根据需要引用它们。在目前的形式中,您的第二个查询会提取销售商品,但不会检查它们是否有库存。

$items = array();
$itemsOnSale = array();
$sql = "SELECT * FROM `Catalog` WHERE state = 'New York' AND in_stock = 'yes' ORDER BY $sort";
$result = mysql_query($sql);
while ( $row = mysql_fetch_assoc($result) ) {
    if ( $row['sale_item'] == 'yes' ) {
        $itemsOnSale[] = $row;  
    } else {
        $items[] = $row;
    }
}

然后构建HTML列表,每隔4个循环从$ itemsOnSale中提取一个数组项。

答案 1 :(得分:0)

看起来您在变量名前面省略了$:

echo '<li>This item number is regular price'.article[id].'</li>'; 应该 echo '<li>This item number is regular price'.$article[id].'</li>';

顺便说一句,看起来你正试图使用​​所谓的MARS - 多个活动结果集。并非所有数据库驱动程序都支持此功能。

答案 2 :(得分:0)

这是你的一个问题:

while ( $article = mysql_fetch_array($result) || $article2 = mysql_fetch_array($result2) ) { 

如果从$result找到结果,则会满足条件并且永远不会填充$article2。您应该重新考虑while循环的流程。

您可以尝试类似

的内容
while ( $article = mysql_fetch_array($result) && $article2 = mysql_fetch_array($result2) ) {

但是,$article1$article2为空后,这将完成。但是,您可以在之后添加另一个while循环,只需

while( $article = mysql_fetch_array($result) ) { // keep posting regular items }

但是你有可能拥有比普通商品更多的促销商品(并且一切都不会被贴出来。)有很多方法可以做到这一点。

此外,您必须使用$引用变量。

echo '<li>This item number is on sale:'.$article2['id']. '</li>';

您的原始代码中还有一个额外的结束括号,请检查您的解析。