![](/img/trans.png)
[英]mysql join query for select rows from two tables that one table is having multiple rows matching to the first table
[英]How to select all matching rows from three tables by join query
我需要通過連接三個mysql表創建一個垂直菜單。
這是普通菜單應該喜歡的。
Main Cat Items 1 -> Categories 1 --> Sub Cat Items 1
Categories 1 --> Sub Cat Items 2
Categories 2 --> Sub Cat Items 3
Categories 3 --> Sub Cat Items 4
Main Cat Items 2 -> Categories 4 --> Sub Cat Items 5
這些是我擁有的三個表:Main_cat
+-------------+---------------+
| main_cat_id | main_cat_name |
+-------------+---------------+
| 1 | main cat 1 |
| 2 | main cat 2 |
| 3 | main cat 3 |
+-------------+---------------+
表:類別
+--------+-------------+----------------+
| cat_id | main_cat_id | cat_name |
+--------+-------------+----------------+
| 1 | 1 | cat1 parent 1 |
| 4 | 1 | cat2 parent 1 |
| 5 | 1 | cat3 parent 1 |
| 6 | 2 | cat 4 parent 2 |
| 7 | 2 | cat 5 parent 2 |
| 8 | 3 | cat 6 parent 3 |
+--------+-------------+----------------+
表格:Sub_cat
+------------+-------------+--------+----------------------+
| sub_cat_id | main_cat_id | cat_id | sub_cat_name |
+------------+-------------+--------+----------------------+
| 1 | 1 | 1 | sub 1 cat1 parent 1 |
| 2 | 1 | 1 | sub 2 cat1 parent 1 |
| 3 | 1 | 4 | sub 3 cat 4 parent 1 |
+------------+-------------+--------+----------------------+
每次嘗試時,我只會得到一個包含一些字段的數組,但是我期望的是麥芽維數組。 這些是我嘗試過的查詢。
這是我通過以下查詢之一獲得的數組之一。
Array
(
[0] => stdClass Object
(
[main_cat_name] => main cat 1
[main_cat_id] => 1
[main_cat_url] =>
[cat_id] => 1
[cat_name] => cat1 parent 1
[cat_url] =>
[sub_cat_id] => 1
[sub_cat_name] => sub 1 cat1 parent 1
[sub_cat_url] =>
)
[1] => stdClass Object
(
[main_cat_name] => main cat 2
[main_cat_id] => 2
[main_cat_url] =>
[cat_id] =>
[cat_name] =>
[cat_url] =>
[sub_cat_id] =>
[sub_cat_name] =>
[sub_cat_url] =>
)
[2] => stdClass Object
(
[main_cat_name] => main cat 3
[main_cat_id] => 3
[main_cat_url] =>
[cat_id] =>
[cat_name] =>
[cat_url] =>
[sub_cat_id] =>
[sub_cat_name] =>
[sub_cat_url] =>
)
)
$query = "SELECT "
. "mc.main_cat_name, mc.main_cat_url, cg.cat_name, cg.cat_url, sc.sub_cat_name, sc.sub_cat_url "
. "FROM"
. " main_cat AS mc "
. "LEFT JOIN "
. "categories AS cg "
. "ON "
. "mc.main_cat_id = cg.main_cat_id "
. "LEFT JOIN "
. "sub_cat AS sc "
. "ON "
. "cg.cat_id = sc.sub_cat_id ";
$query = "SELECT "
. "mc.main_cat_name, mc.main_cat_id, mc.main_cat_url, cg.cat_id, cg.cat_name, cg.cat_url, sc.sub_cat_id, sc.sub_cat_name, sc.sub_cat_url "
. "FROM"
. " main_cat AS mc "
. "LEFT JOIN "
. "sub_cat AS sc "
. "ON "
. "sc.main_cat_id = mc.main_cat_id "
. "LEFT JOIN "
. "categories AS cg "
. "ON "
. "cg.cat_id = sc.cat_id "
. "GROUP BY "
. "main_cat_id";
$query = "SELECT "
. "* "
. "FROM "
. "main_cat mc "
. "LEFT JOIN sub_cat sc "
. "ON sc.main_cat_id = mc.main_cat_id "
. "LEFT JOIN categories cg "
. "ON "
. "cg.cat_id = sc.cat_id "
. "Group BY "
. "sc.cat_id, sc.main_cat_id";
但是這些查詢都沒有給我期望。 你能幫我這個忙嗎
最接近的查詢是:
select mc.main_cat_name, c.cat_name, sc.sub_cat_name
from main_cat mc left join
categories c
on c.main_cat_id = mc.main_cat_id left join
sub_cat sc
on sc.cat_id = c.cat_id
order by mc.main_cat_id, c.cat_id, sc.sub_cat_id;
但是,這將為您填充每個單元格提供“關系”結果。更像是:
Main Cat Items 1 -> Categories 1 --> Sub Cat Items 1
Main Cat Items 1 -> Categories 1 --> Sub Cat Items 2
Main Cat Items 1 -> Categories 2 --> Sub Cat Items 3
Main Cat Items 1 -> Categories 3 --> Sub Cat Items 4
Main Cat Items 2 -> Categories 4 --> Sub Cat Items 5
如果要刪除重復顯示的名稱,則應在應用程序中執行。 可以在數據庫中進行此轉換。 但是,通常SQL查詢的結果集是表,這意味着排序並不重要。 在這種情況下,排序非常關鍵,因為否則您將不知道第二,第三和第四行的正確主類別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.