2017-02-05 81 views
0

我正在使用會員列表和發票在我的俱樂部的php中建立一個網站。我已經安裝我的數據庫如下:我的查詢應該如何設置?

家庭

ID 
Family name 
Adress 
etc. 

會員,並鏈接到家庭ID

ID 
Firstname 
Family_ID 

發票,並鏈接到任何家庭數據庫或會員數據庫

ID 
Amount 
payed 
Family_ID 
Member_ID 

有時候我想開發家庭,比如年度貢獻。但有時候我想爲會員本身發票來發票。

現在我想打一個概覽頁面,看起來有點像下面

Family name1 
     Contribution invoice1 
    Member1 
     Match invoice 1 
    member2 
     Match invoice 2 
Family name2 
     Contribution invoice2 
    Member1 
     Match invoice 3 
    member2 
     Match invoice 4 
etc.... 

我可以關閉過程做一個查詢上家中所有的連接槽迭代他們。並且每行都爲家庭成員查詢和查詢發票。然後再次查詢每個成員的發票。但我認爲應該有一個更復雜的查詢來讓他們在一個大的查詢中。

我希望我的意思很清楚,你們可以幫助我。如果有問題,請告訴我。

回答

0

有點困難,沒有演示數據。但我們假設以下方法:首先,我們構建臨時inv_combined -table(作爲from-部分中的選擇),其將發票結合到家庭和成員,並分別分配contributionmember的類型。這個type稍後用於排序。然後,給出這個組合表,我們分別添加家庭和成員的詳細信息。最後,我們按family.name, type, member.firstname排序,這樣結果會爲每個家庭首先列出所有繳費發票,然後列出所有會員發票。 在你的php代碼中,你只需要通過列表並留意姓名,類型和成員名字的任何變化來開始新的部分。 希望它可以幫助(並希望它的作品):-)

select * from 
((select "Contribution" as type, if.* 
    from invoice if 
    where if.family_id is not null 
    ) 
    UNION 
    (select "Member" as type, im.* 
    from invoice im 
    where if.member_id is not null 
    ) 
) inv_combined left join family on inv_combined.family_id = family.id 
    left join member on inv_combined_member_id = member.id 
order by family.name, inv_combined.type, member.firstname 
+0

2個問題回: '如果*/IM *。' 1)你寫的甲肝2倍。它有什麼作用? 2)'inv_combined_member_id'是'inv_combined.member_id'? – DutchEcho

0

什麼你將需要做的,我相信,是讓你的主查詢加盟成員和發票用某種內的子查詢分隔符。現在,這看起來像是一個非常糟糕的查詢,事實上它很複雜,但我在我的應用程序的多個位置工作。

$query = "SELECT Family.ID, Family.name, 
(SELECT GROUP_CONCAT(
    DISTINCT CONCAT_WS('|||', Member.ID, Member.Firstname 
    COALESCE((SELECT GROUP_CONCAT(
     DISTINCT CONCAT_WS('|', Contribution.ID, Contribution.Amount) 
    SEPARATOR '||') FROM Contribution WHERE Contribution.Member_ID = Member.ID AND Contribution.Family_ID = Family.ID),' '), ' ' 
) 
SEPARATOR '||||' 
) FROM Member WHERE Member.Family_ID = Family.ID) as Members 
FROM Family"; 


//Execute your query, get back $Families... 

foreach($Families as $k1=>$Family) { 
    $Family['Members'] = array_filter(explode("||||", trim($Family['Members']))); 

    foreach($Family['Members'] as $k2=>$Member) { 
     $Member = array_filter(explode("|||", trim($Member))); 
     $Member = [ 
      "ID" => $Member[0], 
      "Firstname" => $Member[1], 
      "Contributions" => array_filter(explode("||", trim($Member[2]))) 
     ]; 

     foreach($Member['Contributions'] as $k3=>$Contribution) { 
      $Contribution = array_filter(explode("|", trim($Contribution))); 

      $Contribution = [ 
       "ID" => $Contribution[0], 
       "Amount" => $Contribution[1] 
      ]; 
      $Member['Contributions'][$k3] = $Contribution; 
     } 
     $Family['Members'][$k2] = $Member; 
    } 
    $Families[$k1] = $Family; 
} 

我跑進與null值的一些問題時,我是建設它,我只是給你的梗概,但我基本上重寫了整個事情的提問。您需要修改一些foreach數組,以便在最後處理該額外空間,刪除任何空字符串(array_filter應該,但只是確定),並處理null值。

參考更多的援助(在那裏我得到了這種類型的查詢的幫助下):MySQL: Nested GROUP_CONCAT

+0

這看起來很複雜。明天我會看看它,所以我有更多時間去看看我不熟悉的所有額外代碼;) – DutchEcho

+0

@DutchEcho這是你能夠使用的東西嗎?如果您有任何問題,請告訴我! – forrestmid

相關問題