MySQL неизвестный столбец в предложении where (UNION)

0

У меня есть следующий запрос:

select a.clei, a.partNumber, 
(
  SELECT count(*) FROM 
    ( SELECT * from search_upload_data s where a.clei is not null AND a.clei = s.clei 
      UNION
      SELECT * from search_upload_data s where a.partNumber is not null AND a.partNumber = s.partNumber 
    ) as t1
) as total
from api_analytics_data a

Это бросает ошибку:

Error Code: 1054. Unknown column 'a.clei' in 'where clause'

Я предполагаю, что MySQL не позволит ссылаться на ссылку во внутреннем SQL, но я не уверен, как обойти это.

Мне нужен счетчик из search_upload_data, см. SQL Fiddle здесь: http://sqlfiddle.com/#!9/172ac/2

<================================================= ========================>

ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ

Мне нужно выяснить, как это сделать с UNION. Условия OR в каждом ответе работают в небольшом масштабе, но боятся вниз по фактической БД с большим количеством данных.

Вот объяснение (для ответа Раджата):

Изображение 174551

  • 0
    Я не следую вашему запросу или вашим данным. Можете ли вы отредактировать свой вопрос и подробно описать логику того, что вы пытаетесь сделать? Понятно, почему ваш текущий запрос выдает ошибку, но в данный момент я ничего не могу вам предложить.
  • 0
    Перейдите по ссылке на скрипку SQL. Это объясняет это в деталях. - sqlfiddle.com/#!9/172ac/2
Показать ещё 7 комментариев
Теги:
join
count
union

4 ответа

1
Лучший ответ

ПОПРОБУЙТЕ ЭТО: Простое объединение с OR и GROUP BY

SELECT a.clei, 
    a.partNumber, 
    COUNT(1) tot
FROM api_analytics_data a
LEFT JOIN search_upload_data s ON (a.clei = s.clei OR a.partNumber = s.partNumber)
    AND (a.clei is not null OR a.partNumber is not null)
GROUP BY a.clei, a.partNumber

ВЫХОД: http://sqlfiddle.com/#!9/94e556/1

  • 0
    Работает в небольшом масштабе, как пример, но не с большими объемами данных. См. ОБЪЯСНЕНИЕ добавлено к моему первоначальному вопросу.
  • 0
    Пожалуйста, сделайте INNER JOIN вместо LEFT JOIN и проверьте производительность.
Показать ещё 2 комментария
1

Это в любом случае соответствует вашему желаемому результату. Просто используя обычный ИЛИ, чтобы выбрать либо clei, либо partnumber.

select a.clei, a.partNumber, 
(
  SELECT count(*) FROM search_upload_data s WHERE 
     (a.clei is not null AND a.clei = s.clei) OR 
     (a.partNumber is not null AND a.partNumber = s.partNumber) 
) as Total
from api_analytics_data a
  • 0
    Это работает! Спасибо
1

попробуй это

select a.clei, a.partNumber, 
 ( SELECT COUNT(1) As Total
       from search_upload_data s
       where ( a.clei is not null  AND a.clei = s.clei )
       OR (a.partNumber is not null AND a.partNumber = s.PartNumber)

    ) as t1 

from api_analytics_data a
  • 0
    Этот тоже работает. Собираюсь сделать несколько тестов, чтобы найти самое быстрое решение. Благодарю.
  • 0
    Что касается производительности, я бы сказал, что запрос @ Susang будет быстрее.
Показать ещё 2 комментария
-2
select a.clei, a.partNumber, 
(
  SELECT count(s.id) FROM search_upload_data s where (a.clei is not null AND a.clei = s.clei) OR (a.partNumber is not null AND a.partNumber = s.partNumber) 
) as Total
from api_analytics_data a

попробуй сейчас

  • 0
    Нет, это не работает Возвращает 7 для всех строк.
  • 0
    Я модифицировал
Показать ещё 1 комментарий

Ещё вопросы

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