在产品标题下显示产品PHP& MySQL的

时间:2012-10-26 15:14:04

标签: php mysql

我有两张桌子; 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。一百万道歉我的格式。

3 个答案:

答案 0 :(得分:2)

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

嗯,我对你的情景有两个很大的疑问:

  1. 我会为表格使用更详细的名称
  2. 我对您的数据库结构有严重怀疑。在一对多的关系中,subcat是否嵌套在子级中?在这种情况下,你不应该在subcat表中有一个类别id,而SublevelID应该是Sublevel表中的PK。
  3. 无论如何,我假设你被绑定到这个结构,所以我克隆它(不使用键/外键,因为你的设计对我来说不是很清楚)

    --
    -- 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);
    }
}

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