SQL子查询 - 取决于第一个查询的值

时间:2011-04-13 15:44:13

标签: php

我是初学者,正在使用Dreamweaver创建网页。我需要一个SQL查询,允许第二个下拉框根据第一个dropbox的结果下拉值。

我有一个MySQL表作为Cars()和另一个表车模型,第三个是汽车年。

这是我到目前为止所做的:

  1. 从汽车中选择不同的汽车 - 这会显示第一个投递箱中的值
  2. 从carmodel中选择不同的carmodel(carmodelid = carid) 现在这就是我遇到问题的地方,根据使用SQL查询的第一个下拉列表的值,在第二个下拉列表中输出值。
  3. 有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

SELECT DISTINCT carmodel FROM carmodel WHERE carmodelid IN (SELECT carid FROM cars) 

答案 1 :(得分:0)

使用普通PHP无法做到这一点,因为当用户选择第一个下拉列表时,PHP已在服务器端完成其工作。你需要javascript,我总是推荐jQuery。

对于MySQL查询,我使用的是我为自己创建的PHP PDO类,我已经习惯了(不要理会这一点)但实质上,只是获取PHP查询的最佳方式,并确保你是不打开SQL注入。你需要google并使用jQuery阅读AJAX和PHP。这是快速,肮脏和未经测试的,所以如果你有疑问,请在评论中打我。这是:

   <label><span>Choose a Car:</span>
        <select name="car" id="car" class="validate[required] longtext" onchange="getCarModels();">
            <option value="">-------Make a Selection------</option>
            <?php
            try{
                $carCount = DB::getDB("mysql", 1, array("carID"))->query("SELECT COUNT(DISTINCT(%s%)) FROM cars")->fetchColumn();
                if ($carCount > 0){
                    $car_sql="SELECT DISTINCT %s% FROM cars";
                    foreach (DB::getDB("mysql", 1, array("carID", "carName"))->query($car_sql) as $row){                                        
                        echo '<option value="'.$row[carID].'">'.$row[carName].'</option>';
                    }
                }
            }catch(PDOException $e){
                print "SQL Error: " . $e->getMessage() . "<br/>";
                exit();
            }
            ?>
        </select>
    </label>
    <label id="carModelsBox" style="display:none;">
        <span>Select Model:</span>
            <select name="carmodel" id="carmodel" class="validate[required] longtext">
        </select>
    </label>

和javascript

function getCarModels(){
    var carID = $('#car option:selected').val();
    if (carID == "") {
        $('#carModelsBox').slideUp("fast");
    }
    $.getJSON("ajax.carmodels.php", {carID:carID}, function(data){
        if (data.success){
            $('#carmodel').html(data.models);
        }else{
            $('#carModelsBox').append("<p>There are no models</p>");
        }
        $('#car').blur();
        $('#carModelsBox').slideDown("fast"); $('#carmodel').focus();
    });
}

这个javascript文件将通过AJAX调用PHP文件。这个文件是ajax.carmodels.php,它将通过GET接收carID。以下代码的片段:

if ($carID!=''){
    try {
        $carModelCount = DB::getDB("mysql", 1, array("carmodel.id"))->query("SELECT COUNT(DISTINCT(%s%)) FROM cars, carmodel WHERE carmodel.id = cars.id")->fetchColumn();
        if ($carModelCount > 0){
            $model_sql="SELECT DISTINCT %s% FROM cars, carmodel WHERE carmodel.id = cars.id";
            foreach (DB::getDB("mysql", 1, array("model", "modelname"))->query($model_sql) as $row){                                        
                $models .= '<option value="'.$row[model].'">'.$row[modelname].'</option>';
            }
            $return['models'] =$models;
            $return['success'] =true;
        }       
    }catch(PDOException $e){
        print "SQL Error: " . $e->getMessage() . "<br/>";
        exit();
    }
}else{
    $return['success'] =false;
}
echo json_encode($return);

最重要的是,不要忘记提供jquery本身。将它放在您的初始PHP中 页。

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script>