我有两张桌子:二级桌和一级桌。subvel包含产品标题或集合组名,而subct1包含所有实际产品。。
这是次级表;CategoryID SublevelID Name
67 1 Anaesthsia Thermometers
67 2 Forehead Thermometers
67 3 Drug Testing Thermometers
67 4 Drug Testing Thermometers
这是另一张表,subcat1;CategoryID SublevelID SubCatName
67 2 12 Level Thermometer
67 1 Clinitrend
67 2 Forehead Thermometer
67 3 Briteline
67 3 BriteEvent
我想要的是输出,当我是指输出时,我的意思是在php代码中是这样的;
麻醉温度计
前额温度计-6件一次性,6件可重复使用,12件
药物测试温度计-Briteline,BriteEvent
我一直遇到的问题是,我一直在重复每个产品的相同标题,但我只希望它一次。我试过GROUP BY、DISTINCT和LEFT JOIN,但是每次检索到的产品都会显示它的类别标题-我知道我可能是以错误的方式查看查询…每当我想到可以更改查询的新内容时,我都会失败。。
从不同的角度来看,但我的大脑并不是这样工作的。。
function catLevelsName(){
// This would be used to select which category $cat_id = $_GET['cat_id'];
global $dbc;
$query = "SELECT subcat1.SubCatName FROM subcat1 RIGHT JOIN sublevel ON sublevel.CategoryID = subcat1.CategoryID";
$result = mysqli_query($dbc, $query) or die(mysqli_error(). "<p>with query;<br />$query");
while($row = mysqli_fetch_array($result)){
echo $row['Name'];
echo $row['SubCatName'];
}
我做错什么了?
万分抱歉我的格式。
最佳答案
简短编辑,回答您的问题:作为一个sql查询结果,不能只有一次子级别标签,因为它将出现在每个sql连接结果行中。我建议您深入研究联接理论以及sql本身如何提供输出行。
好吧,我对你的情况有两大疑问:
我会对表使用更详细的名称
我对你的数据库结构有严重怀疑。子类不是嵌套在子类中,在一对多关系中吗?在这种情况下,子级表中不应该有类别id,子级id应该是子级表中的主键。
无论如何,我假设您绑定到这个结构,所以我克隆了它(不使用键/外键,因为您的设计对我来说不是很清楚)
--
-- Table structure for table `SubCat`
--
CREATE TABLE IF NOT EXISTS `SubCat` (
`CategoryID` int(11) NOT NULL,
`SublevelID` int(11) NOT NULL,
`SubCatName` varchar(127) NOT NULL,
`Url` varchar(127) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `SubCat`
--
INSERT INTO `SubCat` (`CategoryID`, `SublevelID`, `SubCatName`, `Url`) VALUES
(67, 2, '12 Level Thermometer', 'http://www.example.com/subcat-1'),
(67, 1, 'Clinitrend', 'http://www.example.com/subcat-2'),
(67, 2, 'Forehead Thermometer', 'http://www.example.com/subcat-3'),
(67, 3, 'Briteline', 'http://www.example.com/subcat-4'),
(67, 3, 'BriteEvent', 'http://www.example.com/subcat-5');
-- --------------------------------------------------------
--
-- Table structure for table `SubLevel`
--
CREATE TABLE IF NOT EXISTS `SubLevel` (
`CategoryID` int(11) NOT NULL,
`SublevelID` int(11) NOT NULL,
`Name` varchar(127) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Dumping data for table `SubLevel`
--
INSERT INTO `SubLevel` (`CategoryID`, `SublevelID`, `Name`) VALUES
(67, 1, 'Anaesthsia Thermometers'),
(67, 2, 'Forehead Thermometers'),
(67, 3, 'Drug Testing Thermometers'),
(67, 4, 'Drug Testing Thermometers');
输出显示的PHP代码
<?php
// Weird database init
$connection = mysql_connect('localhost', 'root', 'my awesome root password');
mysql_select_db('stack', $connection);
$result = mysql_query("select * from SubLevel s inner join SubCat c on s.SublevelID=c.SublevelID", $connection);
// Output array
$subLevels = array();
// Build our output array
while ($row = mysql_fetch_assoc($result)) {
$subLevelId = $row['SublevelID'];
$subLevels[$subLevelId]['subLevelToDisplay'] = $row['Name'];
$subLevels[$subLevelId]['subCats'][] = "<a href='{$row['SubCatName']}'>{$row['Url']}</a>";
}
// Format output
foreach ($subLevels as $id => $row) {
print "{$row['subLevelToDisplay']} - " . implode(',', $row['subCats']) . "<br />";
}
这是我的输出:
Forehead Thermometers - 12 Level Thermometer,Forehead Thermometer
Anaesthsia Thermometers - Clinitrend
Drug Testing Thermometers - Briteline,BriteEvent
希望这真的能帮到你,无论如何我会重新考虑数据库层在一个更清晰的
结构化的方式。
关于php - 在产品标题PHP和MySQL下显示产品,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13089625/