Представления SQL с правильными объединениями - PullRequest
0 голосов
/ 19 декабря 2011

Мне нужно создать представление, чтобы показать обзор заказов в моей базе данных. В обзоре не нужны элементы заказа, только идентификатор заказа, дата заказа, имя клиента, сумма заказа и статус заказа. В базе данных есть 2 таблицы с данными о клиентах (одна для зарегистрированных пользователей и одна для незарегистрированных пользователей), соответственно shop_customer и shop_temp_customer.

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

Вот структуры таблиц:

shop_orders:

Column Name             Column Type    Null Default

order_id                int(11)         No  None
order_date              int(255)        No  None
order_customer_id       int(11)         Yes NULL
order_temp_customer_id  int(11)         Yes NULL
order_postage           double(11,2)    No  None
order_discount          double(11,2)    No  None
order_total             double(11,2)    No  None
order_status            tinyint(1)      No  None

shop_customers:

Column Name               Column Type  Null Default

customer_id               int(11)       No  None
customer_title            varchar(255)  No  None
customer_forename         varchar(255)  No  None
customer_surname          varchar(255)  No  None
customer_company          varchar(255)  No  None
customer_contact_number   varchar(255)  No  None
customer_email            varchar(255)  No  None
customer_password         varchar(255)  No  None
customer_reference        varchar(255)  No  None
customer_marketing        tinyint(1)    No  None
customer_active           tinyint(1)    No  None
customer_decomission_date int(11)       No  None

shop_temp_customers:

Column Name                     Column Type    Null Default

temp_customer_id                int(11)         No  None
temp_customer_title             varchar(255)    No  None
temp_customer_forename          varchar(255)    No  None
temp_customer_surname           varchar(255)    No  None
temp_customer_company           varchar(255)    No  None
temp_customer_contact_number    varchar(255)    No  None
temp_customer_email             varchar(255)    No  None
temp_customer_reference         varchar(255)    No  None
temp_customer_decomission_date  int(11)         No  None

Вот мой код для представления, но он не тянет никакие элементы данных в:

CREATE VIEW shop_order_view_all_preview AS
SELECT o.order_id, o.order_date, c.customer_forename, c.customer_surname, tc.temp_customer_forename, tc.temp_customer_surname, o.order_total, o.order_status
FROM shop_orders o
RIGHT JOIN shop_customers c
ON c.customer_id = o.order_customer_id
RIGHT JOIN shop_temp_customers tc
ON tc.temp_customer_id = o.order_customer_id

Есть идеи?

EDIT:

Вот некоторые данные из таблиц:

shop_orders:

order_id order_date order_customer_id order_temp_customer_id order_postage order_discount order_total order_status
1        1322697540 2                 NULL                   12.50         0.00           1012.50     0
2        1322697540 NULL              1                      13.00         0.00           1200.00     1

shop_customer:

customer_id customer_title customer_forename customer_surname customer_company customer_telephone customer_email customer_password                 customer_reference customer_marketing customer_active customer_decomission_date
2           Mr             b                 a                d                 044444            a@test.com     098f6bcd4621d373cade4e832627b4f6  Poster / Flyer     1                  1               0

shop_temp_customer:

temp_customer_id temp_customer_title temp_customer_forename temp_customer_surname temp_customer_company temp_customer_contact_number temp_customer_email temp_customer_reference temp_customer_decomission_date
 1               Mr                  e                      asy                   NULL                  04444                        test@test.com       Google                  1322697540

Ответы [ 3 ]

3 голосов
/ 19 декабря 2011

Попробуйте сделать это с левыми соединениями вместо правых, поскольку таблица со ВСЕМИ ордерами находится слева:

CREATE VIEW shop_order_view_all_preview
AS
SELECT
  o.order_id,
  o.order_date,
  c.customer_forename,
  c.customer_surname,
  tc.temp_customer_forename,
  tc.temp_customer_surname,
  o.order_total,
  o.order_status
FROM shop_orders o
  LEFT JOIN shop_customers c ON c.customer_id = o.order_customer_id
  LEFT JOIN shop_temp_customers tc ON tc.temp_customer_id = o.order_customer_id

Возможно, это не решит проблему, но я попробую прежде, чем что-либо еще.

2 голосов
/ 19 декабря 2011

Одна незначительная проблема в последней строке:

CREATE VIEW shop_order_view_all_preview AS
SELECT o.order_id, o.order_date, c.customer_forename, c.customer_surname, tc.temp_customer_forename, tc.temp_customer_surname, o.order_total, o.order_status
FROM shop_orders o
LEFT JOIN shop_customers c
ON c.customer_id = o.order_customer_id
LEFT JOIN shop_temp_customers tc
ON tc.temp_customer_id = o.order_temp_customer_id
--                               ^^^^^

- вы связываете постоянный customer_id из таблицы заказов с временной таблицей клиентов, даже если у вас есть отдельное поле в таблице заказов для временных идентификаторов клиентов.

РЕДАКТИРОВАТЬ: измененные ПРАВО соединения к левым соединениям - таблица заказов должна быть на внутри соединения.

0 голосов
/ 19 декабря 2011

попробуйте это ....

CREATE VIEW shop_order_view_all_preview AS
      SELECT
       shop_orders.order_id, shop_orders.order_date, shop_customers.customer_forename, shop_customers.customer_surname, shop_temp_customers.temp_customer_forename, shop_temp_customers.temp_customer_surname, shop_orders.order_total, shop_orders.order_status
      FROM 
       shop_orders, shop_customers, shop_temp_customers 
      RIGHT JOIN shop_customers 
      ON customer_id = order_customer_id
      AND
      RIGHT JOIN shop_temp_customers
      ON temp_customer_id = order_customer_id
...