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

Мне нужна помощь в синтаксисе mysql.

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

Иногда люди выбирают доставку на свой платежный адрес; Мне нужна только запись номера заказа, где пользователи не вводили адреса доставки и где они вводили адрес доставки.

Если они ввели и адрес для выставления счета, и адрес доставки, мне нужен только адрес доставки, если это имеет смысл.

В таблице иногда дублируются поля для одного номера заказа. Если это сбивает с толку, посмотрите ниже:

------------SQL TABLE ----------- 
order_id | address_type | user_name       | address
100      | billto       | Homer Simposn   | 123 Main St.
100      | shipto       | Homer Simpson   | 455 XYZ Ave. 
101      | billto       | Peter Griffin   | 780 111th St.
102      | billto       | Charles Xavier  | 555 Bergen St.
102      | shipto       | Jean Gray       | 555 Bergen St.

Мне нужно, чтобы вывод был:

100 - shipto - Homer Simposn - 455 XYZ Ave. 
101 - billto - Peter Griffin - 780 111th St.
102 - shipto - Jean Gray - 555 Bergen St.

Вот мой синтаксис, который будет возвращать только записи "shipto".

    SELECT * FROM order_info AS A WHERE A.address_type = 'shipto' AND 
NOT EXISTS (SELECT B.address_type 
                    from order_info AS B 
                    where B.address_type = A.address_type 
                    and B.address_type = 'billto')

Я хотел бы сделать что-то вроде IF, shipto нет, а затем вернуть billto. Возможно ли сделать все в синтаксисе sql?

Спасибо!


person Far    schedule 21.11.2012    source источник


Ответы (2)


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

В частности, вы используете порядок в качестве идентификатора и находите «максимальный» тип адреса в подзапросе (он найдет shipto, если он есть, и billto, если нет), и используете этот результат для подключения к строкам во внешнем запросе.

Например (с использованием неэффективного коррелированного подзапроса):

SELECT * FROM order_info AS A WHERE A.address_type = (
   SELECT MAX(address_type) FROM order_info AS B 
   WHERE A.order_id = B.order_id )

ссылка выше дает пример преобразования этого в более эффективное соединение.

person Jeremy Smyth    schedule 21.11.2012
comment
это очень новаторски... с этого момента я буду помнить, что нужно смотреть на вещи с этого момента... спасибо :) - person Bhrugesh Patel; 21.11.2012
comment
хорошо, спасибо за ваш ответ. Мне все еще нужна небольшая помощь с тем, что вы имеете в виду. Я использовал SELECT * FROM jos_vm_order_user_info A WHERE order_id=(SELECT MAX(B.order_id) FROM jos_vm_order_user_info B WHERE A.address_type = B.address_type), но он возвращает только 2 записи с максимальным найденным номером заказа с billto и ship to. Нравится номер записи 101 - billto - Peter Griffin - 780 111th St. и 102 - shipto - Jean Grey - 555 Bergen St.` - person Far; 21.11.2012
comment
Нужно сделать наоборот - присоединиться к order_id и выбрать максимальное address_type. Скопируйте запрос в моем ответе и замените order_info на jos_vm_order_user_info и посмотрите, сработает ли это. - person Jeremy Smyth; 21.11.2012

select * from test
where address_type = "shipto"
union
select * from test t1
where address_type = "billto"
and (select count(*) from test t2 where t2.order_id = t1.order_id group by order_id) = 1;

Я не уверен, насколько он эффективен, но он точно даст вам результат. Вы можете сопоставить производительность с другими способами, которые вы найдете.

person Bhrugesh Patel    schedule 21.11.2012
comment
лол .. не беспокойтесь об этом .. в любом случае, я использую 3 запроса, которые будут медленнее, чем 2: P - person Bhrugesh Patel; 21.11.2012