簡體   English   中英

如何通過聯接查詢從三個表中選擇所有匹配的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM