выберите DISTINCT адрес электронной почты на основе совпадения идентификатора в разных таблицах

0

Я пытаюсь вытащить уникальные электронные письма с соответствующими идентификаторами в двух таблицах.

SELECT line_items.order_id, line_items.id, orders.email, orders.name
FROM orders INNER JOIN
     line_items
     ON orders.id = line_items.order_id
WHERE line_items.order_id IN (SELECT DISTINCT email FROM orders WHERE status = 0 AND created_at BETWEEN '2018-01-10' AND NOW() )
LIMIT 50;

Я знаю, что моя ошибка основана на том факте, что line_items.order_is является INT, и поэтому параметр IN ищет другой столбец int для сопоставления. Тем не менее, я не уверен, как изменить это, чтобы получить правильные результаты. Всем приветствуется всяческая помощь.

  • 4
    Пожалуйста, объясните, что вы пытаетесь сделать. Образцы данных и желаемые результаты действительно помогут.
  • 1
    Вы можете получить различные идентификаторы заказа или использовать электронную почту в предложении where.
Показать ещё 1 комментарий
Теги:

2 ответа

1

Я пытаюсь вытащить уникальные электронные письма с соответствующими идентификаторами в двух таблицах.

Если вы имеете в виду разные электронные письма, то ваш подзапрос будет выглядеть следующим образом:

SELECT DISTINCT o.email
FROM o.orders
WHERE o.status = 0 AND o.created_at BETWEEN '2018-01-10' AND NOW();

Поскольку заказ должен иметь хотя бы одну позицию, я не понимаю, почему эта таблица необходима.

Ваш запрос подходит для ответа на вопрос: "Вытяните все заказы на электронные письма, которые сделали недавний заказ со статусом 0". Если это то, что вы хотите:

SELECT li.order_id, li.id, o.email, o.name
FROM orders o INNER JOIN
     line_items li
     ON o.id = li.order_id
WHERE o.email IN (SELECT o2.email FROM orders o2 WHERE o2.status = 0 AND o2.created_at BETWEEN '2018-01-10' AND NOW() )
LIMIT 50;
  • 0
    На самом деле только что добрался до этой точки, и это близко. Я хочу вернуть только 1 запись, связанную с письмом. Я только хочу получить 1-е изображение (line_items.id) по электронной почте. В настоящее время он возвращает каждую строку. Текущий запрос выглядит следующим образом: SELECT li.order_id, li.id, o.email, o.name ОТ заказов o2 ГДЕ o2.email! = '' И o2.email НЕ НУЛЬ И И o2.status = 0 И o2.created_at МЕЖДУ '2018-01-10' И СЕЙЧАС ()) LIMIT 50;
1

Трудно следовать, но я думаю, что вы хотите:

SELECT sub.order_id, sub.line_item_id, sub.email, o.name
FROM  
(SELECT o.email, MIN(o.id) AS order_id, MIN(i.id) AS line_item_id
 FROM orders o
 INNER JOIN line_items i
 ON o.id = i.order_id
 WHERE o.status = 0
 AND o.created_at BETWEEN '2018-01-10' AND NOW()
 GROUP BY o.email) sub
LEFT JOIN orders o
ON sub.order_id = o.id

В подзапросе выберите каждое электронное письмо вместе с идентификатором первого заказа и идентификатором позиции. Затем присоединитесь к ним, чтобы заказывать имя заказа. Это предполагает, что MIN (line_item) будет отображаться с MIN (order_id) для каждого электронного письма, поэтому вы должны будете сообщить мне, если это не является допустимым предположением.

  • 0
    Благодарю. Это очень близко (и намного чище, чем моя первая попытка!). Но он по-прежнему возвращает несколько результатов, связанных с одним и тем же адресом электронной почты. Я хочу только один результат по электронной почте. Мысли?
  • 0
    Невозможно, если вы не включите другие столбцы в возвращаемые результаты ... Приведенный выше запрос даст вам одну строку для каждого электронного письма
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню