2014-10-28 4 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 таблицу, но она должна искать членов одной семьи, идентифицируется идентификатором строки в таблице families

РЕШЕНИЕ

Итак, после того, как много, много (много) свинчивание вокруг и мало исследований. Похоже, что @cupid был прав (хотя и очень короткий в его ответе).

И я объясню решение лучше (в надежде, что это поможет кому-то позже).

Опция UNION в MySQL (и, скорее всего, другой SQL) позволяет объединять результирующие множества из двух (или более) запросов SELECT в один результирующий набор. Это очень полезно, если у вас есть подобные данные, в отдельных таблицах, которые вы можете легко выбрать и обрабатывать как один запрос. Также полезно (в моем случае) для разбивки на страницы, позволяя вам использовать параметр LIMIT SQL.

Следует учитывать, что синтаксис 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. –

+0

@ VladGURDIGA Я бы предпочел использовать его в качестве одного запроса, поскольку мне нужно подсчитать строки для функции разбиения на страницы (которая также использует SQL LIMIT) –

ответ

1

Вы думаете об использовании UNION?

+0

У вас есть пример для меня? –

+0

SELECT data WHERE client_type = 0 UNION SELECT data JOIN данные семейства здесь WHERE client_type = 1 http://www.w3schools.com/sql/sql_union.asp – cupid

+0

Я правильно ответил на ваш ответ, хотя был очень краток. При ответе на вопрос, пожалуйста, попробуйте включить пример или какую-то ссылку. Спасибо –

Смежные вопросы