1

2 つのテーブルがあります。sublevel と subcat1。sublevel には製品ヘッダーまたは集合グループ名が含まれ、もう 1 つの subcat1 にはすべての実際の製品が含まれます。

これがサブレベル テーブルです。

CategoryID SublevelID Name
67 1 Anaesthsia Thermometers
67 2 Forehead Thermometers
67 3 Drug Testing Thermometers
67 4 Drug Testing Thermometers

これがもう 1 つのテーブル、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

私が常に直面している問題は、各製品で同じヘッダーを繰り返し続けていることですが、それは 1 回だけにしたいということです。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'];
}

私が間違っていることへのポインタはありますか?

ps。私の書式設定について、百万の謝罪。

4

3 に答える 3

2

あなたの質問に答えるために、短い編集をしてください。SQLクエリの結果として、サブレベルラベルを一度だけ持つことはできません。これは、各SQL結合結果行にあるためです。結合理論と、SQL 自体が出力行を提供する方法について詳しく説明することをお勧めします。

さて、私はあなたのシナリオについて2つの大きな疑問があります:

  1. テーブルにはもっと冗長な名前を使用したでしょう
  2. あなたのデータベース構造に深刻な疑問があります。subcat は、1 対多の関係でサブレベル内にネストされていませんか? この場合、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

これがあなたが望んでいるものであるかどうかはわかりませんが、ここに私がお勧めするクエリがあります:

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 に答える
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 に答える