вопрос MySQL - PullRequest
       31

вопрос MySQL

1 голос
/ 12 января 2011

У меня есть и ЗАКАЗ стол из корзины покупателя. Это типичное имя клиента, адрес и т. Д. Список полей. Суть в том, что корзина заполняет информацию о доставке в соответствующие поля (shipName, shipAddress, ShipState и т. Д.), Когда покупатель вводит информацию о доставке, которая отличается от информации для выставления счета. Однако когда клиент отправляет товар самому себе, корзина не перемещает информацию о доставке в соответствующие поля для отправки (т. Е. ShipName, shipAddress, shipState). Он сохраняет эту информацию в полях ordName, ordAddress, ordCity и т. Д., А затем сохраняет поля, связанные с доставкой, пустыми.

Таким образом, эти поля доставки будут пустыми для заказов, которые клиенты отправляют себе. Я использовал команды IF, чтобы переместить ordName, ordAddr и т. Д. В псевдонимы, когда информация о доставке не указана, так что обрабатывается информация о доставке для всех типов заказов (независимо от того, отправляет ли клиент себе или другому адресу). Эта часть отлично работает в моем запросе ниже.

Осталась одна проблема. Моя программа доставки не может использовать длинное название штата (например, Мичиган, Нью-Йорк и т. Д.). Штат должен состоять из двух символов (например, MI, NY). У меня есть справочная таблица с именем * STATES , в которой есть соответствие между длинным именем состояния и двухбуквенным сокращением. Я пытаюсь использовать псевдоним ShipState, чтобы найти правильное двухсимвольное имя для данного состояния. Я пытался сделать это как JOIN, но продолжаю получать ошибки. Я удалил соединение, которое использовал, и сейчас показываю только тот код, который работает правильно, но не выполняет сопоставление для сокращения состояний. Может кто-нибудь помочь, пожалуйста?

SELECT   
  orders.ordDate AS `Date`,  
  orders.ordID AS Order_ID,  
  orders.ordEmail AS Email,  
  IF(ordShipName = '          ', ordName, ordShipName) AS Name,  
  IF(ordShipAddress = '          ', ordAddress, ordShipAddress) AS Address_1,  
  IF(ordShipAddress2 = '          ', ordAddress2, ordShipAddress2) AS Address_2,  
  IF(ordShipCity = '          ', ordCity, ordShipCity) AS City,  
  IF(ordShipState = '          ', ordState, ordShipState) AS ShipState,  
  IF(ordShipZip = '          ', ordZip, ordShipZip) AS Postal,  
  IF(ordShipCountry = '          ', ordCountry, ordShipCountry) AS Country,  
  IF(ordShipPhone = '          ', ordPhone, ordShipPhone) AS Phone,  

FROM  
  orders   

WHERE  
  orders.ordID > 21700  
  HAVING  
  Country = 'United States of America' 

Ответы [ 3 ]

1 голос
/ 12 января 2011

Вы не можете использовать псевдоним столбца ShipState для объединения с вашей справочной таблицей. Вместо этого повторите процедуру IF снова:

SELECT   
  orders.ordDate AS `Date`,  
  orders.ordID AS Order_ID,  
  orders.ordEmail AS Email,  
  IF(ordShipName = '          ', ordName, ordShipName) AS Name,  
  IF(ordShipAddress = '          ', ordAddress, ordShipAddress) AS Address_1,  
  IF(ordShipAddress2 = '          ', ordAddress2, ordShipAddress2) AS Address_2,  
  IF(ordShipCity = '          ', ordCity, ordShipCity) AS City,  
  IF(ordShipState = '          ', ordState, ordShipState) AS ShipState,  
  IF(ordShipZip = '          ', ordZip, ordShipZip) AS Postal,  
  IF(ordShipCountry = '          ', ordCountry, ordShipCountry) AS Country,  
  IF(ordShipPhone = '          ', ordPhone, ordShipPhone) AS Phone,  
  STATE.StateAbbreviation
FROM  
  orders   
    INNER JOIN STATES
    ON IF(orders.ordShipState = '          ', orders.ordState, orders.ordShipState) = STATES.State

WHERE  
  orders.ordID > 21700  
  HAVING  
  Country = 'United States of America' 
0 голосов
/ 13 января 2011

Так как источником данных является небольшой набор транзакций, это будет очень быстро, я бы сделал это в левом соединении с двумя экземплярами таблицы состояний соответственно в их поле, и ваш SELECT основывался бы на том, что не было пустым... например,

select 
     ...(other fields),
     IF(orders.ordShipState = '          ', s1.StateName, s2.StateName ) as StateName
   from 
      Orders
         left outer join states s1
            on orders.ordstate = s1.state
         left outer join states s2
            on orders.ordShipState = s2.state
   where 
      orders.ordID > 21700
      (etc with rest of query)...

Таким образом, соединение всегда будет иметь соединение, основанное на ОБА ВОЗМОЖНЫХ состояниях ... Итак, в зависимости от того, что существует, исходя из ваших предпочтений, сначала получите состояние ТА, в противном случаеполучить другой.

0 голосов
/ 12 января 2011

Вы должны поместить код туда, где вы пытаетесь соединить две таблицы. У вас может быть просто синтаксическая ошибка, с которой кто-то может вам помочь. Если у вас есть таблица с именем STATES с столбцами state и state_abrev, попробуйте следующее:

select ..., .., ..., STATES.state_abrev, ..., ..., из заказов, STATES, где STATES.state = orders.ordShipState AND ... ... HAVING ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...