2013-03-07 3 views
0

Клиентприсоединяющиеся 3 Таблицы MySQL

╔═══════╦══════════╗ 
║ CUSID ║ CUS NAME ║ 
╠═══════╬══════════╣ 
║  1 ║ AA  ║ 
║  2 ║ BB  ║ 
║  3 ║ CC  ║ 
╚═══════╩══════════╝ 

CusSeaFood

╔════╦═══════╦══════════╗ 
║ ID ║ CUSID ║ NAME ║ 
╠════╬═══════╬══════════╣ 
║ 1 ║  1 ║ SeaFoodA ║ 
║ 2 ║  1 ║ SeaFoodB ║ 
║ 3 ║  2 ║ SeaFoodC ║ 
╚════╩═══════╩══════════╝ 

CusPizza

╔════╦═══════╦══════╗ 
║ ID ║ CUSID ║ NAME ║ 
╠════╬═══════╬══════╣ 
║ 1 ║  1 ║ PAA ║ 
║ 2 ║  2 ║ PBB ║ 
╚════╩═══════╩══════╝ 

Cu sSnack

╔════╦═══════╦══════╗ 
║ ID ║ CUSID ║ NAME ║ 
╠════╬═══════╬══════╣ 
║ 1 ║  2 ║ SAA ║ 
║ 2 ║  3 ║ SBB ║ 
╚════╩═══════╩══════╝ 

Хочет посчитать, сколько из морепродуктов, пиццы или закусок являются порядком, в котором, например клиенте, как показано ниже.

Cus ID, Cus Name, Number Of SeaFood, Sea Food info, Number Of Pizza, Pizza info, Number of Snack, Snack info. 

Клиент не может заказывать все 3 вида продуктов питания.

+0

Вам нужно использовать ЛЕВЫЙ ВНЕШНИЙ ВЕДУЩИЙ. Что вы пробовали? – Barmar

ответ

4

Вам нужно отдельно рассчитать каждый счет через подзапрос, чтобы вы могли получить правильные результаты. Это позволит вам рассчитать повторяющиеся записи.

SELECT a.*, 
     COALESCE(b.totalSeaFood, 0) totalSeaFood, 
     COALESCE(c.totalPizza, 0) totalPizza, 
     COALESCE(d.totalSnack, 0) totalSnack 
FROM Customer a 
     LEFT JOIN 
     (
      SELECT cusID, COUNT(*) totalSeaFood 
      FROM CusSeaFood 
      GROUP BY cusID 
     ) b ON a.cusID = b.CusID 
     LEFT JOIN 
     (
      SELECT cusID, COUNT(*) totalPizza 
      FROM CusPizza 
      GROUP BY cusID 
     ) c ON a.cusID = c.CusID 
     LEFT JOIN 
     (
      SELECT cusID, COUNT(*) totalSnack 
      FROM CusSnack 
      GROUP BY cusID 
     ) d ON a.cusID = d.CusID 

Для дальнейшего получить больше знаний о присоединяется, любезно перейдите по ссылке ниже:

Результат

╔═══════╦══════════╦══════════════╦════════════╦════════════╗ 
║ CUSID ║ CUS NAME ║ TOTALSEAFOOD ║ TOTALPIZZA ║ TOTALSNACK ║ 
╠═══════╬══════════╬══════════════╬════════════╬════════════╣ 
║  1 ║ AA  ║   2 ║   1 ║   0 ║ 
║  2 ║ BB  ║   1 ║   1 ║   1 ║ 
║  3 ║ CC  ║   0 ║   0 ║   1 ║ 
╚═══════╩══════════╩══════════════╩════════════╩════════════╝ 
+0

спасибо за предоставленную ссылку. – kitokid

+0

приветствуется ': D' –

1

«Информация о морепродуктах», «Информация о пицце» и т. Д. В вашем примере для меня не имеет смысла. Если заказчик заказал более одного морепродукта или пиццы, как он должен быть представлен здесь?

Обычно вы ожидаете увидеть несколько строк, по одной для заказанной вещи. И чтобы получить эту информацию, вам даже не понадобится соединение, просто UNION.

SELECT * FROM CusSeaFood WHERE CusID = ? 
UNION SELECT * FROM CusPizza WHERE CusID = ? 
UNION SELECT * FROM CusSnack WHERE CusID = ? 
Смежные вопросы