вопрос по MySQL-запросу

У меня есть таблица ORDERS из корзины покупателя. Это типичное имя клиента, адрес и т. д. Список полей. Суть в том, что корзина будет заполнять информацию о доставке в соответствующие поля (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' 

person Alan    schedule 12.01.2011    source источник
comment
Кроме того, просто предложение. Не могли бы вы изменить его так, чтобы столбцы ordShipName, ordShipAddress были установлены в NULL, когда нет данных, и использовать функцию MySQL ifnull()? Кажется, стало бы намного чище. dev.mysql.com/doc/refman/ 5.0/ru/   -  person SenorPuerco    schedule 12.01.2011
comment
Хорошее предложение, однако, корзина является купленным продуктом, и я не хочу менять какие-либо структуры данных корзины, так как каждый раз, когда я делаю обновление в корзине, мне также придется вносить это изменение.   -  person Alan    schedule 13.01.2011


Ответы (3)


Вы не можете использовать псевдоним столбца 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' 
person Joe Stefanelli    schedule 12.01.2011

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

выберите ..., .., ..., СОСТОЯНИЯ.state_abrev, ..., ..., из заказов, СОСТОЯНИЯ, где СОСТОЯНИЯ.состояние = заказы.ordShipState И... ... ИМЕЮЩИЕ...

person Nick Rolando    schedule 12.01.2011
comment
Не уверен, что точно понимаю. Мой псевдоним ShipsState содержит длинное название штата (Нью-Йорк, Мичиган и т. д.) для каждого заказа. Мне нужно изменить значения, представленные в псевдониме ShipState, на аббревиатуру штата, используя справочную таблицу STATES. - person Alan; 13.01.2011
comment
Правильно, вы должны ВЫБРАТЬ STATES.state_abrev (чтобы получить аббревиатуру) FROM orders, STATES (обе таблицы), WHERE orders.ordShipDate = STATES.state (И order.ordID = useridили w.e) Делает ли это смысл? WHERE orders.ordShipDate = STATES.state будет похоже на ваше присоединение - person Nick Rolando; 13.01.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)...

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

person DRapp    schedule 13.01.2011