在下面我有两个表。在第一个表中,我有一个模型列表。在第二张表上,我为一些模型添加了键。例如,我为Id
模型添加了2个键(123和125)
id(AI) model
1 100
2 101
3 100
4 105
5 107
modelKeys
keyid(AI) model_id key
1 1 123
2 1 125
3 4 125
4 5 127
现在,使用PHP PDO,我想列出所有模型和模型的键。
<?php
$query =
"
SELECT
m.*,
mk.*
FROM
models as m
LEFT JOIN modelKeys as mk
ON m.id = mk.model_id
ORDER BY
m.id
";
$sql = $db -> query($query);
$sql -> execute();
$fetch = $sql -> fetchAll(PDO::FETCH_ASSOC);
?>
<ol>
<?php
foreach($fetch as $models)
{
echo "
<li>
$models[model]";
foreach($fetch as $keys)
{
echo "<ul>";
if($models['id'] == $keys['keyid'])
{
echo "<li>$keys[key]</li>";
}
echo "</ul>";
}
</li>";
}
?>
</ol>
结果 model
100
123
125
100
123
125
101
100
105
125
107
127
如您所见,编号为100的模型是重复的,因为它有两个键。我尝试使用SELECT DISTINCT
和GROUP BY
,但没有得到正确的结果。
正确的结果应该是 model
100
123
125
101
100
105
125
107
127
我只是好奇。这是你的表在提琴我做的结果:http://sqlfiddle.com/#!2/cae823/3
结果
ID MODEL KEYID MODEL_ID KEYNR
1 100 1 1 123
1 100 2 1 125
2 101 (null) (null) (null)
3 100 (null) (null) (null)
4 105 3 4 125
5 107 4 5 127
据我所知,你的SQL没有重复。(不是如果你使用"m.id = mk.model_id"在你的SQL)。所以这几乎就是你想要的(只是格式需要调整)。
您可以遍历这些结果,并对MODEL中的每个更改执行<li>
。然后打印所有的KEYNR。
<?php
$query =
"
SELECT
m.*,
mk.*
FROM
models as m
LEFT JOIN modelKeys as mk
ON m.id = mk.model_id
ORDER BY
m.id
";
$sql = $db -> query($query);
$sql -> execute();
$fetch = $sql -> fetchAll(PDO::FETCH_ASSOC);
echo "<ol>";
$lastmodelid = 0;
foreach($fetch as $row) {
if ($row['id'] != $lastmodelid) {
if ($lastmodelid!=0) { echo "</li>"; }
echo "<li>$row['model']";
}
$lastmodelid = $row['id'];
echo "<ul>";
echo "<li>$row['keynr']</li>";
echo "</ul>";
}
if ($lastmodelid!=0) { echo "</li>"; }
echo "<ol>";
?>
我假设您没有使用MODEL_ID/KEYNR创建自己的副本。如果你做,那么你确实需要使用一些DISTINCT,但在这种情况下,我建议不要对m.*和mk.*做select,而是使用你想要的字段。
像这样:http://sqlfiddle.com/#!2/cae823/6
SELECT
DISTINCT
m.MODEL,
mk.KEYNR
FROM
models as m
LEFT JOIN modelKeys as mk
ON m.id = mk.model_id
ORDER BY
m.id
结果:MODEL KEYNR
100 123
100 125
101 (null)
100 (null)
105 125
107 127
using PHP:
$PassedKeys="";
foreach($fetch as $models)
{
//this should work
if(strpos($PassedKeys,';'.$models['id'].';')===false){
$PassedKeys.=";".$models['id'].";";
}
else{
continue;
}
echo "
<li>
$models[model]";
foreach($fetch as $keys)
{
echo "<ul>";
if($models['id'] == $keys['keyid'])
{
echo "<li>$keys[key]</li>";
}
echo "</ul>";
}
</li>";
}