![](/img/trans.png)
[英]MYSQL Join two table fields with same field value but will still include if the other field doesn't match the other one
[英]Join Function used to match value of field in one table with other table
当表中的字段值与另一个表的字段中的值匹配时,我正在尝试显示字段值。
就像我正在创建一个下拉字段。 这里基于汽车 Model 下拉菜单。 像法拉利一样 Model 用户在下拉列表中选择了表 newcar_products 下的 prod_name 然后其变体如 Portnifo、superfast、488 应显示在 Variant 字段下。
但是到目前为止发生的事情 - 无论 model 选择法拉利、本田还是大众汽车 - 变体都会显示完整的变体列表,如 polo、jazz、portnifo、accord、passat 存储在表 newcar_variants 的 v_name 中。 我希望变量 v_name 应该只显示表 A 中的 v_prod_id 与表 B 中的 id 匹配
就像,我已经创建了这两个函数,其中第一个 function 的下拉菜单运行良好
<?php
function model_drop_down(){
$database = JFactory::getDBO();
$sql = "SELECT * from #__newcar_products where state='1' order by prod_name Asc";
$database->setQuery($sql);
$rows = $database->loadObjectList();
$list="";
foreach($rows as $row){
$list.="<option value='".$row->id."' style='padding-left:10px;'>".$row->prod_name."</option>";
}
return $list;
}
function variant_drop_down(){
$database = JFactory::getDBO();
$sql = "SELECT a.id, a.v_name FROM #__newcar_variants a JOIN #__newcar_products b ON a.v_prod_id = b.id
and a.state='1' where 1 order by a.v_prod_id asc";
$database->setQuery($sql);
$rows = $database->loadObjectList();
$list="";
foreach($rows as $row){
$list.="<option value='".$row->id."' style='padding-left:10px;'>".$row->v_name."</option>";
}
return $list;
} ?>
<div class="common-box">
<div class="common-box-left">Car Model*</div>
<div class="common-box-right">
<div id="txtHint">
<select name="model" class="list-box-big" id="model" lang="MUST" title="Model" style="width:245px; height:25px;">
<option value="" selected="selected" style="padding-left:10px;"> Select Model</option>
<?php echo model_drop_down();?>
</select>
</div>
</div>
</div>
<!--box end-->
<!--box start-->
<div class="common-box">
<div class="common-box-left">Sub Model*</div>
<div class="common-box-right">
<div id="txtHintVariant">
<select name="variant" class="list-box" id="brand" lang="MUST" title="Brand">
<option value="" selected="selected" style='padding-left:10px;'>Select Variant</option>
<?php echo variant_drop_down();?>
</select>
</div>
截至目前,显示所有型号和所有变体名称的字段。 现在在变体的第二个字段中发生了什么,它显示存储在 v_name 中的所有值,而不仅仅是那些在 v_name 下的值,其中 newcar_variants 中的 v_prod_id 与 newcar_products 中的 id 匹配
我认为需要一种方法第1步当用户select Model从第一个字段下拉时,字段id的varle需要存储在newcar_products
步骤 2 然后在 select 变体的第二个字段中,当用户 select 在第一个字段中下拉 model 时。 存储在 newcar_products 中的“id”值应与第二个表 newcar_variants 中的 v_prod_id 匹配,因此要在匹配“v_name”中显示的变体列表
如何创建 function 以实现所需。 任何人都可以帮助,新手这将是一个很好的学习。 谢谢
在存根数据库连接后,我获取了您的代码并添加了缺少的功能。
您可以使用下面的链接现场试用:
https://code.sololearn.com/wm6EGyHmt5cj
只需单击绿色的“运行”按钮,您就可以在下拉菜单中选择 select 和 model 并查看相应过滤的变体。
这也是完整的代码(以防此链接过期):
<?
function getModel($id, $name) {
$row = new stdClass();
$row->id = $id;
$row->prod_name = $name;
return $row;
}
function getVariant($id, $name, $modelId) {
$row = new stdClass();
$row->id = $id;
$row->v_name = $name;
$row->v_prod_id = $modelId;
return $row;
}
function model_drop_down(){
//---YOUR CODE COMMENTED BELOW---
// $database = JFactory::getDBO();
// $sql = "SELECT * from #__newcar_products where state='1' order by prod_name Asc";
// $database->setQuery($sql);
// $rows = $database->loadObjectList();
//---END OF YOUR COMMENTED CODE---
//---MY DB STUB BELOW
$rows = [];
array_push($rows, getModel(0, 'Ferrari'));
array_push($rows, getModel(1, 'Honda'));
array_push($rows, getModel(2, 'Volkswagen'));
//---END OF MY DB STUB
$list="";
foreach($rows as $row){
$list.="<option value='".$row->id."' style='padding-left:10px;'>".$row->prod_name."</option>";
}
return $list;
}
function variant_drop_down(){
//---YOUR CODE COMMENTED BELOW---
// $database = JFactory::getDBO();
// $sql = "SELECT a.id, a.v_name FROM #__newcar_variants a JOIN #__newcar_products b ON a.v_prod_id = b.id
// and a.state='1' where 1 order by a.v_prod_id asc";
// $database->setQuery($sql);
// $rows = $database->loadObjectList();
//---END OF YOUR COMMENTED CODE---
//---MY DB STUB BELOW
$rows = [];
array_push($rows, getVariant(0, '250 GTO', 0));
array_push($rows, getVariant(1, 'F430', 0));
array_push($rows, getVariant(2, 'F40', 0));
array_push($rows, getVariant(3, 'Civic', 1));
array_push($rows, getVariant(4, 'CR-V', 1));
array_push($rows, getVariant(5, 'Golf', 2));
array_push($rows, getVariant(6, 'Polo', 2));
array_push($rows, getVariant(7, 'Passat', 2));
//---END OF MY DB STUB
$list="";
foreach($rows as $row){
$list.="<option value='".$row->id."' data-v_prod_id='".$row->v_prod_id."' style='padding-left:10px;'>".$row->v_name."</option>";
}
return $list;
}
?>
<div class="common-box">
<div class="common-box-left">Car Model*</div>
<div class="common-box-right">
<div id="txtHint">
<select name="model" class="list-box-big" id="model" lang="MUST" title="Model" style="width:245px; height:25px;">
<option value="" selected="selected" style="padding-left:10px;"> Select Model</option>
<?php echo model_drop_down();?>
</select>
</div>
</div>
</div>
<!--box end-->
<!--box start-->
<div class="common-box">
<div class="common-box-left">Sub Model*</div>
<div class="common-box-right">
<div id="txtHintVariant">
<select name="variant" class="list-box" id="brand" lang="MUST" title="Brand">
<option value="" selected="selected" style='padding-left:10px;'>Select Variant</option>
<?php echo variant_drop_down();?>
</select>
</div>
</div>
</div>
<script>
//wait for html DOM loaded
document.addEventListener("DOMContentLoaded", function(event) {
//listen to "model dropdown changed by user" event
document.getElementById("model").onchange = function filterVariants(){
//get the currently selected model
const selectedModelId = document.getElementById('model').value;
if(selectedModelId=="") {
//if no model is selected, show all the variants (set display=block for all options)
for(option of document.querySelectorAll('#brand>option')) {
option.style.display='block';
}
} else {
//if a model is selected, show the only variants having 'data-v_prod_id' attribute equal to the id of the selected model, plus the defaul "Select Variant" option
for(option of document.querySelectorAll('#brand>option')) {
if(option.getAttribute('data-v_prod_id')==selectedModelId) {
//variant from the selected model => show the option
option.style.display='block';
} else if(option.value=="") {
//default option (the one with "Select Variant") => show it
option.style.display='block';
option.selected=true;
} else {
//else, it's a variant from another model => hide it
option.style.display='none';
}
}
}
//reset the variant dropdown to default "Select Variant" value
document.querySelector('#brand>option[value=""]').selected=true
};
});
</script>
这是我的更改的描述:
1. 样机数据
当然,我无权访问您的数据库,因此我将 SQL 连接和查询替换为几行代码以创建模型数据:
function getModel
generates a model object that looks like a SQL model result row
function getVariant
生成一个变体 object 看起来像 SQL 变体结果行
然后在您的model_drop_down
function 中,我手动创建数据以填充$rows
以使$rows
看起来与您的 SQL 查询的结果相同:
array_push($rows, getModel(0, 'Ferrari'));
array_push($rows, getModel(1, 'Honda'));
array_push($rows, getModel(2, 'Volkswagen'));
例如,最后一行意味着我正在创建一个模型 model,id=2 和 name='Volkswagen'
然后我对你的variant_drop_down
中的变体做了同样的事情:
array_push($rows, getVariant(0, '250 GTO', 0));
array_push($rows, getVariant(1, 'F430', 0));
array_push($rows, getVariant(2, 'F40', 0));
array_push($rows, getVariant(3, 'Civic', 1));
array_push($rows, getVariant(4, 'CR-V', 1));
array_push($rows, getVariant(5, 'Golf', 2));
array_push($rows, getVariant(6, 'Polo', 2));
array_push($rows, getVariant(7, 'Passat', 2));
例如,最后一行意味着我正在创建一个 id=7、name='Passat' 和 v_prod_id=2(即大众汽车)的模型变体。
好的,现在我已经为你的数据库存根了,我们可以开始编码了!
2. 更改 SQL 变体查询以获取所有变体和 select 'v_prod_id' 字段
variant_drop_down
只会被调用一次(php是服务端语言,运行一次会渲染页面的html代码,不会再次运行),所以我们需要一次获取所有数据,并取回v_prod_id字段以记住哪个变体属于哪个 model(我们将在接下来的步骤中使用此信息)
因此,我们将更改查询中的两件事:
所以从这里:
SELECT a.id, a.v_name FROM #__newcar_variants a JOIN #__newcar_products b ON a.v_prod_id = b.id and a.state='1' where 1 order by a.v_prod_id asc
你最终会得到这样的东西:
SELECT a.id, a.v_name, a.v_prod_id FROM #__newcar_variants a where a.state='1' order by a.v_prod_id asc
3. 在变体下拉列表的每个项目上添加 v_prod_id
这是通过在代码中添加data-v_prod_id='".$row->v_prod_id."'
来完成的。
现在,变体下拉列表的 html 代码如下所示:
<select name="variant" class="list-box" id="brand" lang="MUST" title="Brand">
<option value="" selected="selected">Select Variant</option>
<option value="0" data-v_prod_id="0">250 GTO</option>
<option value="1" data-v_prod_id="0">F430</option>
<option value="2" data-v_prod_id="0">F40</option>
<option value="3" data-v_prod_id="1">Civic</option>
<option value="4" data-v_prod_id="1">CR-V</option>
<option value="5" data-v_prod_id="2">Golf</option>
<option value="6" data-v_prod_id="2">Polo</option>
<option value="7" data-v_prod_id="2">Passat</option>
</select>
如您所见,我们在每个变体上都有 data-v_prod_id。
现在,对于变体下拉列表中的每个选项,我们知道它与哪个 model 相关。
因此,使用 javascript,每次用户更改 model 时,我们可以过滤显示的变体,其中 v_prod_id 等于所选 model。
4.使用javascript进行动态变体过滤
每次用户更改 model 时,我们都会相应地过滤变体下拉列表。
这是执行此操作的脚本,我在每一行都添加了注释以解释详细信息:
<script>
//wait for html DOM loaded
document.addEventListener("DOMContentLoaded", function(event) {
//listen to "model dropdown changed by user" event
document.getElementById("model").onchange = function filterVariants(){
//get the currently selected model
const selectedModelId = document.getElementById('model').value;
if(selectedModelId=="") {
//if no model is selected, show all the variants (set display=block for all options)
for(option of document.querySelectorAll('#brand>option')) {
option.style.display='block';
}
} else {
//if a model is selected, show the only variants having 'data-v_prod_id' attribute equal to the id of the selected model, plus the defaul "Select Variant" option
for(option of document.querySelectorAll('#brand>option')) {
if(option.getAttribute('data-v_prod_id')==selectedModelId) {
//variant from the selected model => show the option
option.style.display='block';
} else if(option.value=="") {
//default option (the one with "Select Variant") => show it
option.style.display='block';
option.selected=true;
} else {
//else, it's a variant from another model => hide it
option.style.display='none';
}
}
}
//reset the variant dropdown to default "Select Variant" value
document.querySelector('#brand>option[value=""]').selected=true
};
});
</script>
希望我的回答能让你满意。
同样,您可以通过单击此链接进行现场试用: https://code.sololearn.com/wm6EGyHmt5cj然后单击绿色的“运行”按钮。
<optgroup>
这个 HTML 标签可以帮助你吗? https://developer.mozilla.org/fr/docs/Web/HTML/Element/Optgroup
那么你只有一个数据库查询:
function variant_drop_down(){
$database = JFactory::getDBO();
$sql = "SELECT b.prod_name, a.id, a.v_name FROM #__newcar_variants a JOIN #__newcar_products b ON a.v_prod_id = b.id
and a.state='1' where 1 order by a.v_prod_id asc";
$database->setQuery($sql);
$rows = $database->loadObjectList();
$list="";
$label=null;
foreach($rows as $row){
if ($label!=$row->prod_name) {
if (null!==$label) {
$list.="</optgroup>";
}
$label=$row->prod_name;
$list.='<optgroup label="'.$label.'">';
}
$list.="<option value='".$row->id."' style='padding-left:10px;'>".$row->v_name."</option>";
}
if (null!==$label) {
$list.="</optgroup>";
}
return $list;
} ?>
无论您试图实现什么,都不能仅通过 PHP 来完成。 您必须使用 JQuery/JavaScript 来获得结果。
如果您的模型和变体是 static 则使用文森特的代码,但要进行动态操作,您必须使用以下代码。
我只是给出一个想法,你必须锻炼基于 ajax 的解决方案的确切解决方案。
这将是第一个退出选项:
<select name="model" id="model">
<?php echo model_drop_down();?>
</select>
<select name="variant" id="variant">
</select>
您的 Jquery 代码将如下所示:
$(document).ready(function() {
$('#model').change(function() {
$.ajax({
type : 'POST',
url : 'variant.php',
dataType : 'json',
data: {
model : $('#model').val()
},
success: function(data){
$('#variant >option').remove();
var s= document.getElementById('model');
s.options[s.options.length]= new Option('Kindly Select Variant', '');
$.each(data.variant, function() {
s.options[s.options.length]= new Option(this, this);
})
}
});
});
})
您的变体.php 文件
//I don't know the exact variant value but the post value is the mode id number here
// $_POST["model"] = $row->id
$database = JFactory::getDBO();
//Create the query to exact the only variants of model number here
$sql = "SELECT a.id, a.v_name FROM #__newcar_variants a JOIN #__newcar_products
b ON a.v_prod_id = b.id and a.state=$_POST["model"] where 1 order by a.v_prod_id asc";
$database->setQuery($sql);
$rows = $database->loadObjectList();
foreach($rows as $row){
$t[]= $row->v_name;
}
$return['variant']=$t;
echo json_encode($return);
这不是确切的解决方案,而是一个基本想法,您必须根据需要进行更改。 此示例可能包含一些小错误,因为它未运行
如果用户根据加载的汽车变体选择 var model,我更喜欢基于 ajax 的解决方案。关联
您也可以 go 用于基于 php 阵列的解决方案,让我知道我也可以向您展示,但我更喜欢 ajax 解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.