在下面我有2张桌子。在第一个表格中我有一个模型列表。在第二个表上我添加了一些模型的键。例如,我为Id
1
模型
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的模型是重复的,因为它有2个键。我尝试使用SELECT DISTINCT
和GROUP BY
,但没有得到正确的结果。
model
100
123
125
101
100
105
125
107
127
答案 0 :(得分:1)
使用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>";
}
答案 1 :(得分:1)
我只是好奇。这是你在小提琴中的表格的结果: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没有重复项。 (如果你在SQL中使用了“m.id = mk.model_id”)。所以这几乎就是你想要的(只需要调整格式)。
你可以遍历这些结果,并且对于MODEL中的每个更改,都会为MODEL执行<li>
。然后只需打印所有KEYNR。
所以在PHP这样的事情:(我没有测试这段代码的错误):
<?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。*上做一个选择,但只需使用你想要的字段。
像这样: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