2015-10-13 58 views
2

我有以下表格:在3個表中選擇屬於哪個屬性的mysql數據?

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| c_id  | bigint(20) | NO | PRI | NULL | auto_increment | 
| c_name  | varchar(255) | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

文章

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| a_id  | bigint(20) | NO | PRI | NULL | auto_increment | 
| a_name  | varchar(255) | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

Course_Articles

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| ca_id  | bigint(20) | NO | PRI | NULL | auto_increment | 
| a_id  | bigint(20) | NO |  | NULL |    | 
| c_id  | bigint(20) | NO |  | NULL |    | 
| t_id  | bigint(20) | NO |  | NULL |    | 
| sort_order | int(11)  | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

期限(或學期)

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| t_id  | bigint(20) | NO | PRI | NULL | auto_increment | 
| t_name  | varchar(255) | NO |  | NULL |    | 
| c_id  | bigint(20) | NO |  | NULL |    | 
| sort_order | int(11)  | NO |  | NULL |    | 
+-------------+--------------+------+-----+---------+----------------+ 

我需要從這些表顯示數據如下:

課程名稱:現代天然氣開採

文章:

  • 介紹
  • 概述氣體提取技術

  • 期限1:常規技術

    • 煤礦甲烷
    • 另一種常規技術
  • 另一篇文章不在術語

  • 另外一個

  • 期限2:非常規技術

    • 煤炭地下氣化
    • 煤層氣
    • 水力壓裂
  • 結論

我知道這個數據將受益也許嵌套/樹。但這是我必須合作的。正如你所看到的文章可以屬於一個術語或者是獨立的。

對於如何高效地查詢以上輸出按照示例,我有點難住。

<?php 
// UPDATED with UNION as suggested 
try { 
$stmt = $dbh->prepare(
    "SELECT ca . * , a.a_name, t.t_name 
FROM Course_Article AS ca 
LEFT JOIN Article AS a ON a.a_id = ca.ca_id 
LEFT OUTER JOIN Term AS t ON t.t_id = ca.t_id 
WHERE ca.c_id = '2' 
UNION SELECT te.t_name, te.t_id, te.c_id 
FROM Term AS te 
WHERE te.t_id = '2'"); 

$last_term_id = -1; 

$stmt->execute(); 
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { 
    if ($last_term_id != $row['t_id']) { 
    echo "<b>" . $row['t_name'] . "</b><br />"; 
    $last_term_id = $row['t_id']; 
    } 
    echo $row['a_name'] . "<br />"; 
    } 
} catch(PDOException $e) { 
    echo 'Error : '. $e->getMessage(); 
    exit(); 
    } 
?> 

謝謝

+0

不要混合連接樣式。事實上,如果你從來不使用逗號連接,那麼你不會犯太多錯誤。 – Strawberry

+0

'高效地查詢' - 以及把你的sql查詢有相當基本的級別錯誤,也許你應該嘗試學習一些關於sql基礎知識之前尋求其他人的幫助(=解決方案)。 – ejuhjav

+0

我有一個腦屁。我想你沒有得到那些。 ;) –

回答

0

因此,這裏是一個知道如何與工會做到這一點:第一部分得到下他們所有的條款(也是空的)和文章,和第二部分得到所有的其他文章屬於課程,但不屬於任何學期。希望我沒有在這裏包含太多的邏輯/打字錯誤。

select t.t_name, ca.*, a.a_name 
from Term t 
left outer join Course_Article ca ON ca.t_id = t.t_id 
left outer join Article a ON a.a_id = ca.a_id 
where t.c_id = '2' 

UNION 

select null as t_name, ca.*, a.a_name 
from Course_Articles ca 
left outer join Article a ON a.a_id = ca.a_id 
where ca.c_id = '2' and ca.t_id is null 

此外,如果您需要訂購的結果的位(說不上如果排序順序是當然的文章和詞之間通用的),你可以擴展這個有點(添加你需要的最後不管列結果導入主要選擇):

select t_name, a_name, sort_column 
FROM 
(
    select t.t_name, ca.*, a.a_name, t.sort_order as sort_column 
    from Term t 
    left outer join Course_Article ca ON ca.t_id = t.t_id 
    left outer join Article a ON a.a_id = ca.a_id 
    where t.c_id = '2' 

    UNION 

    select null as t_name, ca.*, a.a_name, ca.sort_order as sort_column 
    from Course_Articles ca 
    left outer join Article a ON a.a_id = ca.a_id 
    where ca.c_id = '2' and ca.t_id is null 
) dt 
order by sort_column ASC 
+0

Thx ejuhjav,第一人似乎幾乎這樣做,儘管由於某種原因某個術語有2篇文章返回4次(2 x與不正確的c_id和2與正確的c_id和相關文章)。排序很重要,所以我會嘗試。儘管這是最接近的! –

+1

我稍微更新了答案(從工會的第二部分刪除了一個不必要的連接):您是否已經檢查過哪些部分的聯合會導致太多/不正確的行? – ejuhjav

+0

現在我收到一個錯誤,因爲刪除左外連接使我們失去了術語名稱。 –