У меня есть три таблицы: таблица заказов и таблица клиентов и таблица состояния заказа, и в таблице заказов и в таблице клиентов есть Customerid в качестве общего поля, а в order и orderstatus есть order_status_id в качестве общего поля.

В таблице клиентов есть поля имени, фамилии, телефона и адреса электронной почты.

Теперь, если мне нужно искать / выбирать заказы в соответствии с именем и / или фамилией клиента, и / или телефоном, и / или электронной почтой, и / или orderid, то каким должен быть формат mysql для запроса соединения, чтобы я мог объединить все три таблицы получить результаты из таблицы заказов вместе со статусом заказа из таблицы статуса заказа?

1
OM The Eternity 25 Июн 2010 в 15:51
2
Вы меня очень взволновали темой своего вопроса! ;-)
 – 
richsage
25 Июн 2010 в 15:52
Вы видите, что это называется маркетингом / рекламой / кампанией.
 – 
OM The Eternity
25 Июн 2010 в 15:53
Я нажал на заголовок, чтобы посмотреть, есть ли здесь что-нибудь супер веселое (клоуны? Цирк?). Думаю нет.
 – 
Amy B
25 Июн 2010 в 15:55
Для этого вам нужно зайти на meta.stackoverflow.com и попросить их предоставить новые функции в редакторе, чтобы мы могли добавить несколько ваших любимых (клоунов? Цирк?)
 – 
OM The Eternity
25 Июн 2010 в 15:58
Он все еще не работает .. согласно решениям, поэтому я лучше подумал об его удалении, так как это может привести к вашей отрицательной маркировке
 – 
OM The Eternity
25 Июн 2010 в 16:07

3 ответа

Лучший ответ

Вы можете просто присоединиться к столам. Нет необходимости во внешних соединениях или чем-либо в соответствии с вашим текущим определением данных.

SELECT * 
FROM Orders o, customers c, orderstatus s
WHERE o.customerid = c.customerid
AND o.order_status_id = s.order_status_id
AND c.firstname = 'OM'
AND c.LASTNAME = 'The Eternity'
AND o.orderid = 752
AND ...
2
Konerak 25 Июн 2010 в 16:13

Ну, я бы начал с ЛЕВОГО СОЕДИНЕНИЯ всех трех таблиц вместе.

Потом; структурируйте свое предложение where, чтобы иметь такую ​​строку для каждого параметра (в основном; применение фильтров только в случае, если параметры предоставлены)

WHERE 
(@customerFirstName IS NULL OR @customerFirstName = customers.FirstName)
AND (@customerLastName IS NULL OR @customerLastName = customers.LastName)
etc...

В зависимости от количества ожидаемых записей; или если производительность недостаточна; вы можете подумать о создании табличной переменной для хранения меньшего подмножества данных. (т.е. создайте таблицу #customers; а затем вставьте только тех клиентов, которые соответствуют критериям поиска клиентов. Затем присоедините ее к двум другим вашим таблицам)

Сообщите мне, если я неправильно понял ваш вопрос; или если вам нужны пояснения.

1
Jim B 25 Июн 2010 в 16:09
Да, нужно. Что вы поняли по моему вопросу? Из приведенного выше условия мне нужны данные из таблицы заказов и статус заказа из таблицы orderstatus.
 – 
OM The Eternity
25 Июн 2010 в 16:12
Хм; не уверен, что понимаю; но если вы соедините все три стола вместе; вы можете включить данные из таблицы заказов и таблиц статуса заказов в свой пункт выбора.
 – 
Jim B
25 Июн 2010 в 16:21

Что-то типа:

SELECT `orders`.* , 
 `orderstatus`.`description`,
 `customers`.`firstname`, `customers`.`lastname`, `customers`.`phone`,`customers`.`email`
FROM `orders`
LEFT JOIN `customers` ON `customers`.`id`=`orders`.`customerid`
LEFT JOIN `orderstatus` ON `orderstatus`.`orderid`=`orders`.`id`
WHERE `customers`.`lastname`='blogs'

Я не уверен в таблице статуса вашего заказа.

1
Pete 25 Июн 2010 в 16:13