这是我的数据库结构
Categories table
id title
-----------
1 cars
2 city
3 names
------------
subcategory table
id cat_id title
1 1 BMW
2 1 Kia
3 2 Moscow
4 1 Passat
5 2 London
6 3 John
----------------------
现在我正在使用这样的foreach获取类别和打印:
$myquery = query("Select * From categories"); // These functions only for example
$array = mysql_fetch_array($myquery); // These functions only for example
foreach($array as $cat){
echo $cat['title'];
echo "<br />";
// in here must be again foreach or other loop to print subcats belongs to
// this category id, otuput like this:
// Cars
// -- BMW
// -- KIA
// -- Passat
// City
// -- Moscow and etc...
}
我不想在foreach中使用新查询,我想用mysql JOIN做这个,但我不知道怎么做。谁能帮帮我?
答案 0 :(得分:1)
mysql连接将是:
SELECT subcategory.*, categories.title as cat_title FROM subcategory JOIN categories ON subcategory.cat_id = categories.id ORDER BY subcategory.cat_id;
这将为您提供一个表格,其中包含具有其他类别信息的所有子类别项目
php看起来像这样:
$result = mysql_fetch_array($myquery);
foreach($result as $row){
// this is the category name
print($row['cat_title']);
// the title of the subcategory item
print($row['title']);
}
如果您不希望每次签出this时都打印类别名称,请发布如何按一个列排序表格。将数组更改为多维数组,以便您可以使用两个foreach。那么Php会是这样的:
$categories = array();
// result comes from the SELECT
foreach($result as $row){
if(isset($row['cat_title']) && !empty($row['cat_title'])){
if(!isset($categories[$row['cat_title']]) || !is_array($categories[$row['cat_title']])){
$categories[$row['cat_title']] = array();
}
array_push($categories[$row['cat_title']], $row);
}
}
现在,您可以使用foreach查看类别:
foreach($categories as $category => $items){
print($category);
foreach($items as $item){
print("\t".$item);
}
}
答案 1 :(得分:0)
对于你的任务可能是一个很好的解决方案是两个查询,一个用于所有类别,一个用于所有具有联接猫(或没有)的子类别。
所有猫的第一个循环和第二个循环用于此猫的子序列。
foreach ($cats as $category) {
echo $category['title'];
foreach ($subcats as $subcat) {
if ($subcat['cat_id'] !== $cat['id']) {continue;}
echo '--'.$subcat['title']
}
}
另一个带有一个查询的变体是带有已打印类别的附加数组,如
<强> SQL:强> 正如@ miile7和bradbury9提供订单
SELECT subcategory.*, categories.title as cat_title FROM subcategory JOIN categories ON subcategory.cat_id = categories.id ORDER BY subcategory.cat_id;
<强> PHP:强>
$printedIds = [];
foreach ($subcats as $subcat) {
if (!in_array($subcat['cat_id'] ,$printedIds)) {
$printedIds []= $subcat['cat_id'];
echo $category['title'];
}
echo '--'.$subcat['title'];
}
P.S。它的好主意是以一种风格命名表:全部为复数或全部为单一。