2014-10-28 91 views
0

因此,我創建了一個數據庫。它存儲關於家庭和每個家庭成員的信息。然後它使用這些記錄將發票與家人或家庭成員相關聯。PHP MySQL將兩個表連接到條件連接

我的困境是我需要將所有這些發票列在家庭記錄下的頁面上,即創建與家庭本身或個人家庭成員相關的發票清單。

表結構

發票

id | date_entered | invoice_date | invoice_number | invoice_amount | client_type | unique_id | supplier_type | supplier_id | category_id | childcare_hours 
---+--------------+--------------+----------------+----------------+-------------+-----------+---------------+-------------+-------------+---------------- 
1 | 1411098397 | 1411048800 | 123   | 0.01   | 0   | 137  | 0    | 139   | 5   | NULL 

家庭

id | ufi  | last_name  | address_1 | address_2 | city_id | phone | mobile | email | f_d_worker_1 | f_d_worker_2 | status_id | trans_date | entry_date | exit_date | eligible_date | active_date | lga_loc_id | facs_loc_id | ind_status_id | referral_id | active_status | comm_org_id | notes 
---+----------+-----------------+-------------+-----------+---------+-------+--------+-------+--------------+--------------+-----------+------------+------------+-----------+---------------+-------------+------------+-------------+---------------+-------------+---------------+-------------+------- 
1 | 1-XEWUDZ | Forsyth - Ennis | Skinner St. | NULL  | NULL | NULL | NULL | NULL | 13   | NULL   | 1   | NULL  | 1341324000 | NULL  | 1341842400 | 1342620000 | 7   | 1   | 3    | NULL  | 1    | 1   | NULL 

客戶(家庭成員)

id | upi | last_name | first_name | birthdate | sex | phone | mobile | email | indig_status_id | referral_id | relationship_id | preschool_id | family_id | notes 
---+----------+-----------+------------+------------+-----+-------+--------+-------+-----------------+-------------+-----------------+--------------+-----------+------ 
1 | 1-XFCBBP | Ennis  | Jason  | 20/09/1996 | 1 | NULL | NULL | NULL | 3    | NULL  | NULL   | NULL   | 1   | NULL 

我現在的SQL是這樣的:

SELECT `invoices`.`id`, `invoices`.`date_entered`, `invoices`.`invoice_date`, `invoices`.`invoice_number`, `invoices`.`invoice_amount`, `invoices`.`client_type`, `invoices`.`unique_id`, `unique1`.`ufi`, `unique2`.`upi`, `unique1`.`last_name`, `invoices`.`supplier_type`, `invoices`.`supplier_id`, `suppliers`.`name`, `invoices`.`category_id`, `cat1`.`name`, `cat2`.`name`, `invoices`.`childcare_hours` 
FROM `invoices` 
LEFT OUTER JOIN `suppliers` ON `suppliers`.`id` = `invoices`.`supplier_id` 
LEFT OUTER JOIN `categories` cat1 ON `cat1`.`id` = `invoices`.`category_id` 
LEFT OUTER JOIN `preschool_types` cat2 ON `cat2`.`id` = `invoices`.`category_id` 
LEFT OUTER JOIN `families` unique1 ON `unique1`.`id` = `invoices`.`unique_id` 
LEFT OUTER JOIN `clients` unique2 ON `unique2`.`id` = `invoices`.`unique_id` 
WHERE (`invoices`.`unique_id` = ? AND `unique1`.`ufi` = ?) LIMIT 0, 10 

但是我需要檢查client_type列,如果它等於1,它需要在clients表外觀,但它需要尋找同一家庭的成員查詢,由ID行的families

SOLUTION

好確定,所以經過很多很多(多)胡鬧和一個小小的研究。看起來@cupid是正確的(儘管他的回答非常簡短)。

而且我會更好地解釋解決方案(希望以後可以幫助他人)。

MySQL中的UNION選項(以及最有可能的其他SQL)允許您將兩個(或多個)SELECT查詢的結果集組合到一個結果集中。如果您擁有類似的數據,那麼這非常有用,您可以在單獨的表格中輕鬆選擇並按照一個請求進行處理。通過允許您使用SQL的LIMIT選項,對分頁也很有幫助(在我的情況下)。

需要考慮的一件事是,UNION語法使用第一個SELECT語句的列作爲所有後續查詢的列名稱,同時您還需要確保在所有列中選擇了相同數量的列查詢這個工作。

(
    SELECT 
     `invoices`.`id`, 
     `invoices`.`date_entered`, 
     `invoices`.`invoice_date`, 
     `invoices`.`invoice_number`, 
     `invoices`.`invoice_amount`, 
     `invoices`.`client_type`, 
     `invoices`.`unique_id`, 
     `clients`.`upi`, 
     `clients`.`last_name`, 
     `clients`.`family_id`, 
     `invoices`.`supplier_type`, 
     `invoices`.`supplier_id`, 
     `suppliers`.`name`, 
     `invoices`.`category_id`, 
     `cat1`.`name`, 
     `cat2`.`name`, 
     `invoices`.`childcare_hours` 
    FROM 
    (
     `invoices` 
      LEFT OUTER JOIN `suppliers` ON `suppliers`.`id` = `invoices`.`supplier_id` 
      LEFT OUTER JOIN `categories` cat1 ON `cat1`.`id` = `invoices`.`category_id` 
      LEFT OUTER JOIN `preschool_types` cat2 ON `cat2`.`id` = `invoices`.`category_id` 
      LEFT OUTER JOIN `clients` ON `clients`.`id` = `invoices`.`unique_id`) 
     WHERE 
      `clients`.`family_id` = 47 AND `invoices`.`client_type` = 1 
    ) 
UNION 
( 
    SELECT 
     `invoices`.`id`, 
     `invoices`.`date_entered`, 
     `invoices`.`invoice_date`, 
     `invoices`.`invoice_number`, 
     `invoices`.`invoice_amount`, 
     `invoices`.`client_type`, 
     `invoices`.`unique_id`, 
     `families`.`ufi`, 
     `families`.`last_name`, 
     `families`.`id`, 
     `invoices`.`supplier_type`, 
     `invoices`.`supplier_id`, 
     `suppliers`.`name`, 
     `invoices`.`category_id`, 
     `cat1`.`name`, 
     `cat2`.`name`, 
     `invoices`.`childcare_hours` 
    FROM `invoices` 
     LEFT OUTER JOIN `suppliers` ON `suppliers`.`id` = `invoices`.`supplier_id` 
     LEFT OUTER JOIN `categories` cat1 ON `cat1`.`id` = `invoices`.`category_id` 
     LEFT OUTER JOIN `preschool_types` cat2 ON `cat2`.`id` = `invoices`.`category_id` 
     LEFT OUTER JOIN `families` ON `families`.`id` = `invoices`.`unique_id` 
    WHERE 
     `invoices`.`unique_id` = 47 AND `invoices`.`client_type` = 0 
) 
+0

我會去更簡單的查詢,每個都做一件事,然後將它們加入到SQL之外。 – 2014-10-28 07:50:51

+0

@VladGURDIGA我寧願將它用作一個查詢,因爲我需要爲分頁函數計數行(它也使用SQL LIMIT) – 2014-10-28 07:56:36

回答

1

您是否想過使用UNION?

+0

您是否有我的例子? – 2014-10-28 09:05:13

+0

SELECT data WHERE client_type = 0 UNION SELECT data JOIN這裏的家庭數據WHERE client_type = 1 http://www.w3schools.com/sql/sql_union.asp – cupid 2014-10-28 09:26:37

+0

我已經標記了你的答案是正確的,儘管它非常簡短。回答問題時,請嘗試添加一個示例或某種參考。謝謝 – 2014-10-29 00:58:09