2017-01-17 54 views
3

我從那裏我試圖獲取數據 表3個MySQL表:表PHP SQL左連接獲取所有

list_id | name | description 
------------------------------------- 
1234  | name1 | sample description1 
1235  | name2 | sample description2 

表:list_to_category

id  | list_id | category_id 
-------------------------------- 
1  | 1234  | 1 
2  | 1234  | 2 
3  | 1234  | 3 
4  | 1235  | 2 
5  | 1235  | 3 

而且表:類別

id  | title  | parent_id 
-------------------------------- 
1  | Category 1 | 0 
2  | Category 2 | 0 
3  | Category 3 | 0 

並從PHP SQL查詢我想獲取像下面的數據

1. name1 - category 1, category 2, category 3 
2. name2 - category 2, category 3 

我想下面的查詢

SELECT list.name, category.title FROM list 

     LEFT JOIN list_to_category 
     ON list.id = list_to_category.list_id 

     LEFT JOIN category 
     ON list_to_category.id = category.id 

這給我分配到一個列表這樣

1. name1 - category 1 
2. name2 - category 2 

只有單一類別名稱是否可以在單個查詢?

+0

這只是一個簡單的循環(在一個有序的結果)在PHP中 - 而你的斷言是不正確的。 – Strawberry

+0

另外請注意,list_to_category中的代理鍵沒有任何作用。 – Strawberry

+0

我真的不會爲此使用GROUP_CONCAT。這是不必要的限制。 – Strawberry

回答

2

您可以使用GROUP_CONCAT此:由 「名」

select 
    l.list_id, 
    l.name, 
    group_concat(distinct c.title) categories 
from list l 
left join list_to_category lc 
on l.list_id = lc.list_id 
left join category c 
on lc.category_id = c.id 
group by l.list_id 
+0

嘿!感謝您的回答。它解決了我的問題:) – Sanjeev

1

使用GROUP_CONCAT爲集團獲取結果:

SELECT L.name, GROUP_CONCAT(C.title) as title FROM list L  
     LEFT outer JOIN list_to_category LC ON L.list_id = LC.list_id  
     LEFT outer JOIN category C ON LC.category_id = C.id 
     group by L.name 

使用GROUP_CONCAT爲分組依據 「LIST_ID」 爲同一列表名稱取結果:

SELECT L.name, GROUP_CONCAT(C.title) as title FROM list L  
      LEFT outer JOIN list_to_category LC ON L.list_id = LC.list_id  
      LEFT outer JOIN category C ON LC.category_id = C.id 
      group by L.list_id 
+0

然後根據「名稱」按「list_id」 – jainvikram444

2

你可以試試這個解決方案。

select l.list_id, l.name, (select group_concat(c.title) from list_to_category ltc JOIN category c ON c.id=ltc.category_id where ltc.list_id=l.id) from list l 

希望這會幫助你!

0

從下面的代碼應該很明顯,我不是PHP編碼器。然而,這應該讓人想到。你也可以使用javascript/css來處理轉換,這意味着事情可以更動態...

哦,我改變了一些表/列的名稱 - 因爲我喜歡它更好的方式...

<?php 

require('path/to/connection/statements'); // $con 

$query = " 
SELECT l.list_id 
    , l.name 
    , l.description 
    , c.category_id 
    , c.title 
    , c.parent_id 
    FROM list l 
    JOIN list_category lc 
    ON lc.list_id = l.list_id 
    JOIN category c 
    ON c.category_id = lc.category_id 
ORDER 
    BY l.list_id 
    , c.category_id; 
"; 

$result = mysqli_query($con,$query); 

$my_array = array(); 

while($row = mysqli_fetch_assoc($result)){ 
$my_array[] = $row; 
} 

$new_array = array(); 
foreach ($my_array as $row) 
{ 
    $new_array[$row['list_id']][$row['name']][$row['description']][] = $row['title']; 
} 

print_r($new_array); 

?> 

這將打開一個這樣的數組:

Array 
(
    [0] => Array 
     (
      [list_id] => 1234 
      [name] => name1 
      [description] => sample description1 
      [category_id] => 1 
      [title] => Category 1 
      [parent_id] => 0 
     ) 

    [1] => Array 
     (
      [list_id] => 1234 
      [name] => name1 
      [description] => sample description1 
      [category_id] => 2 
      [title] => Category 2 
      [parent_id] => 0 
     ) 

    [2] => Array 
     (
      [list_id] => 1234 
      [name] => name1 
      [description] => sample description1 
      [category_id] => 3 
      [title] => Category 3 
      [parent_id] => 0 
     ) 

    [3] => Array 
     (
      [list_id] => 1235 
      [name] => name2 
      [description] => sample description2 
      [category_id] => 2 
      [title] => Category 2 
      [parent_id] => 0 
     ) 

    [4] => Array 
     (
      [list_id] => 1235 
      [name] => name2 
      [description] => sample description2 
      [category_id] => 3 
      [title] => Category 3 
      [parent_id] => 0 
     ) 

) 

...到一個這樣的數組...

Array 
(
    [1234] => Array 
     (
      [name1] => Array 
       (
        [sample description1] => Array 
         (
          [0] => Category 1 
          [1] => Category 2 
          [2] => Category 3 
         ) 

       ) 

     ) 

    [1235] => Array 
     (
      [name2] => Array 
       (
        [sample description2] => Array 
         (
          [0] => Category 2 
          [1] => Category 3 
         ) 

       ) 

     ) 

) 
0

試試這個代碼

select l.name,c.title 
    from list_to_category lc join list l on lc.list_id=l.id 
    join category c on lc.catg_id=c.id