2014-10-08 31 views
1

我有一個問題與MySQL join.let我解釋我有什麼表。只有2表使用PHP的Mysql加入問題

表1

rid  hid  email 
1   501  10 
1   502  20 
2   501  30 
4   8075  40 
1   501  50 

表2

rid  title  
1   pw1  
2   pw1  
3   pw2  
4   pw4 

我的代碼是像下面

$allhids = array(501,502,8075); //all the unique hids 

foreach($allhids as $k=>$v) 
{ 
$getsubrows = mysqli_query($conn, "SELECT table1.hid,table2.title,sum(table1.email) as totalqty 
       FROM `table1`,table2 
       where table1.hid = ".$v." 
       and table2.rid = table1.rid 
       group by table2.title ") or die(mysqli_error($conn)); 
    while($subrow = mysqli_fetch_array($getsubrows, MYSQLI_NUM)) 
    { 
     echo $subrow[0]."----".$subrow[1]."----".$subrow[2]."<br>";  
    } 
} 

現在它輸出作爲

501----pw1----60 
501----pw2----30 
502----pw1----20 
8075----pw4----40 

現在,我希望它是這樣

501----pw1----60 
501----pw2----30 
501----pw4----0 
502----pw1----20 
502----pw2----0 
502----pw4----0 
8075----pw1----0 
8075----pw2----0 
8075----pw4----40 

所以我想包括其ID不存在於表1,如果不存在,則標題會顯示0

其實每個HID總是會有3(pw1,pw2,pw4)行。如果沒有電子郵件然後0.

任何建議或提示真的很感激。提前感謝。

+0

你可以改變''''總和(table1.email)''''到''''IFNULL(SUM(table1.email),0)''''在你的查詢中? – 2014-10-08 09:45:39

+0

謝謝。我用它進行了測試,但現在仍然顯示其他標題爲排。 – Raj 2014-10-08 09:48:09

+0

我已經添加了一些額外的信息。 – Raj 2014-10-08 09:49:38

回答

1

您需要首先生成所有的行,然後用left join得到數據:

SELECT h.hid, t2.title, coalesce(sum(t1.email), 0) as totalqty 
FROM (SELECT distinct hid FROM table1) h CROSS JOIN 
    (SELECT distinct rid FROM table1) r LEFT JOIN 
    table2 t2 
    ON t2.rid = r.rid LEFT JOIN 
    table1 t1 
    ON h.hid = t1.hid 
group by h.hid, t2.title; 

注:這不包括where條款,這似乎與預期的結果不符。

+0

非常感謝。我試着用它,並得到了一個sql錯誤,說#1054 - 在'條款' – Raj 2014-10-08 10:48:53

+0

我知道了很多這個答案中的未知列't1.rid'。 +1 – 2014-10-09 10:29:58

0

table2你有兩行與pw1(1,2)這樣的結果的第一行就會90不60.

下面是該查詢。子查詢A形成hid,title和子查詢B的所有可能的變體,然後只計算它們的LEFT JOIN

SELECT A.hid, 
     A.title, 
     ifnull(B.email_sum,0) as totalqty 

FROM 
(SELECT DISTINCT 
     t1.hid, 
     t2.title 
    FROM Table1 t1 
     CROSS JOIN Table2 t2 
) as A 
LEFT JOIN 
(
    SELECT Table1.hid, 
     Table2.title, 
     SUM(Table1.email) as email_sum 
    FROM Table1 
     JOIN Table2 on (Table1.rid=Table2.rid) 
    GROUP BY Table1.hid, Table2.title 
) as B 
    on (A.hid=B.hid AND A.title=B.title) 

ORDER BY A.Hid,A.Title 

SQLFiddle demo

+0

第一個結果行中的值來自兩個Table1.rid/Table1.hid組合(1/501),這是Table1的第一行和最後一行。因此它是60.或者我錯過了什麼? – 2014-10-08 12:02:31

+0

@OcasoProtal第一行是'501 ---- pw1 ----'對,但在表2中有兩行'PW1'(1,2),所以實際上你應該從Table1中總結3行。 – valex 2014-10-08 12:29:53

+0

啊,現在我明白你的意思了。謝謝! – 2014-10-08 12:37:40