1

我有两张桌子;sublevel 和 subcat1。sublevel 包含产品标题或集体组名称,另一个 subcat1 包含所有实际产品..

这是子级表;

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,但检索到的每个产品都显示它的类别标题 - 我知道我可能以错误的方式查看查询......每次我想到一些我可以改变的新东西我失败的查询..

我什至画出了表格结构和理想的输出,以不同的方式看待它,但我的大脑不是这样工作的……

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'];
}

任何指向我做错了什么的指针?

附言。一百万为我的格式道歉。

4

3 回答 3

2

简短编辑,回答您的问题:作为 sql 查询结果,您不能只拥有一次子级标签,因为它将在每个 sql-join 结果行中。我建议您更深入地了解连接理论以及 sql 本身如何提供输出行。

好吧,我对您的情况有两个很大的疑问:

  1. 我会为表使用更详细的名称
  2. 我对你的数据库结构有严重的怀疑。subcat 不是以一对多的关系嵌套在 sublevel 内吗?在这种情况下,您不应该在 subcat 表中有类别 ID,并且 SublevelID 应该是 Sublevel 表中的 PK。

无论如何,我假设你绑定到这个结构,所以我克隆了它(不使用键/外键,因为你的设计对我来说不是很清楚)

--
-- 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

希望这实际上对您有所帮助,无论如何我会以更清晰和结构化的方式重新考虑数据库层。

于 2012-10-26T15:54:27.600 回答
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);
    }
}

我没有测试过,但我认为它应该可以工作:)

于 2012-10-26T15:56:24.557 回答
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 代码读取数据并以您想要的格式打印它。

于 2012-10-26T15:45:42.213 回答