簡體   English   中英

PHP MySQL通過條件聯接聯接兩個表

[英]PHP MySQL joining two tables with conditional joins

因此,我有一個正在創建的數據庫。 它存儲有關家庭和每個家庭成員的信息。 然后,它將使用這些記錄將發票與家庭或家庭成員相關聯。

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

表結構

發票

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

好吧,經過很多很多研究和研究之后。 看來@cupid是正確的(盡管他的回答很簡短)。

我將更好地解釋該解決方案(希望以后能對某人有所幫助)。

MySQL(以及最可能的其他SQL)中的UNION選項使您可以將兩個(或多個)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
)

您是否考慮過使用UNION?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM