关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。
10个月前关门了。
改进这个问题
我试图显示正确的数据树,但我是,股票,所以我希望有人能给我指出正确的方向。
我已经尝试了php代码和纯sql代码,让我首先展示一下我迄今为止的尝试。
public function supported($ids) {
$arr = json_decode($ids, true);
$STH = $this->dbh->query("SELECT cid,device FROM supported_devices WHERE id IN (".implode(',',$arr).")");
$a = $STH->fetchAll();
if(count($a)) {
foreach($a as $b) {
$newArr[] = $b['cid'];
}
$STH = $this->dbh->query("SELECT cid,cat_name FROM supported_devices_cats WHERE id IN (".implode(',',$newArr).")");
$c = $STH->fetchAll();
foreach($c as $d) {
$newArr2[] = $d['cid'];
}
$STH = $this->dbh->query("SELECT cat_name FROM supported_devices_cats WHERE id IN (".implode(',',$newArr2).")");
$e = $STH->fetchAll();
foreach($e as $parent) {
$return[] = $parent['cat_name'];
foreach($c as $child) {
$return[] = $child['cat_name'];
foreach($a as $device) {
$return[] = $device['device'];
}
}
}
return $return;
} else {
return array();
}
}
SELECT DISTINCT c.*
FROM supported_devices_cats c
LEFT JOIN supported_devices_cats pc
ON c.id = pc.cid
WHERE
c.cid IS NOT NULL
OR (c.cid IS NULL
AND pc.cid IS NULL)
我试图使这样的父类别显示在第一,然后所有的子类别后,正确的设备是在每个子类别。我不知道我还能怎么解释,我加了一张画,也许这能更好地解释我在做什么。
更新,我需要升级我的mysql服务器到一个更高的版本。
1条答案
按热度按时间dba5bblo1#
我不太清楚为什么在表中需要“cid”列。只需输入外键的id就足够了。
话虽如此,以下是我用作数据库模式和测试内容的内容:
我接下来要做的是一个cte递归查询(在较新的mysql/mariadb服务器中提供—对于较旧的版本,需要一个具有self-join的等效查询):
这将产生包含所有必需信息的以下结果:
现在在这个结果表中,当dev\u name为null时,它是一个父类别。您可以通过这种方式从中获取所有父类别。然后,对于每个父类别,当您将id与cat\ U id进行比较时,可以找到子类别。最后,您可以轻松获得所有设备。
老实说,我试图使它成为一个“全sql”解决方案,但我很难按照您想要的方式对表进行排序。我打赌其他人能做得更好。
p、 这里是一个快速肮脏的黑客排序问题。我用“->”分隔符将主类别放在子名称前面。这样你以后就可以很容易地把它们分开。
生产:
您甚至可以添加“where cat\u id is not null”条件来删除这两个无用的行。所有其他行都包含您需要的内容。