我有两张桌子; sublevel和subcat1。 sublevel包含产品标题,或集合组名称和另一个,subcat1包含所有实际产品..
这是sublevel表;
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代码中是这样的;
麻醉温度计 - Clinitrend
额头温度计 - 6次活动一次性,6次活动可重复使用,12次活动
药物测试温度计 - Briteline,BriteEvent
我一直遇到的问题是我不断对每个产品重复相同的标题,但我只想要一次。我已经尝试了GROUP BY,DISTINCT和LEFT JOIN但是每个检索到的产品都会显示它的类别标题 - 我知道我可能会以错误的方式查看查询...每当我想到一些我可以改变的新东西时查询我失败了..
I even drew out the table structure along with the ideal output以不同的方式看待它,但我的大脑不会那样工作..
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'];
}
指出我做错了什么?
PS。一百万道歉我的格式。
答案 0 :(得分:2)
简短编辑,回答你的问题:你不能拥有,作为一个sql查询结果,只有一次sublevel标签,因为它将在每个sql-join结果行。我建议你深入研究连接理论以及sql本身如何提供输出行。
嗯,我对你的情景有两个很大的疑问:
无论如何,我假设你被绑定到这个结构,所以我克隆它(不使用键/外键,因为你的设计对我来说不是很清楚)
--
-- 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
希望这实际上对你有所帮助,无论如何我会更清楚地重新考虑数据库层 结构化的方式。
答案 1 :(得分:0)
我不确定这是否是您想要的,但这是我建议的查询:
select sl.Name, sc.SubCatName from sublevel sl
join subcat1 sc
on sc.CategoryID=sl.CategoryID
and sc.SublevelID=sl.SublevelID
order by sl.Name;
这为我提供了样本数据的输出,如下所示:
'Anaesthsia Thermometers', 'Clinitrend'
'Drug Testing Thermometers', 'BriteEvent'
'Drug Testing Thermometers', 'Briteline'
'Forehead Thermometers', 'Forehead Thermometer'
'Forehead Thermometers', '12 Level Thermometer'
根据需要设计查询后,只需使用PHP代码读取数据并以所需格式打印即可。
答案 2 :(得分:0)
你可以尝试一个肮脏的解决方案...... :)
使用Emo Mosley的回复......你可以使用数组。
示例:
$array_results = array();
$query = "select sl.Name, sc.SubCatName from sublevel sl
join subcat1 sc
on sc.CategoryID=sl.CategoryID
and sc.SublevelID=sl.SublevelID
order by sl.Name;"
$result = mysqli_query($dbc, $query) or die(mysqli_error(). "<p>with query;<br />$query");
while($row = mysqli_fetch_array($result)){
$array_results[$row['Name']][] = $row['SubCatName'];
}
然后:
foreach ($array_results as $key => $value) {
if(is_array($value)){
echo $key.": ".implode(", ", $value);
}
}
我没有测试过,但我认为它应该可行:)