Подсчет полного внешнего соединения в MySQL - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь отобразить общее количество строк в полной таблице внешних соединений. У меня есть следующий код, но mysql говорит, что есть ошибка с дублирующимися столбцами. Две таблицы, актеры и режиссеры, имеют те же столбцы, что и для предоставления аналогичной информации в соответствующих категориях.

SELECT COUNT(*) FROM 
(SELECT * FROM directors LEFT OUTER JOIN actors
ON directors.name = actors.name
UNION
SELECT * FROM directors RIGHT OUTER JOIN actors
ON directors.name = actors.name) AS table1;

Что можно сделать, чтобы исправить код, чтобы он работал правильно? К вашему сведению, код из круглых скобок работает нормально. Проблема возникает только после того, как я вставил предложение SELECT COUNT (*).

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Может быть лучше изменить правую часть соединения без резервирования и просто добавить отдельную имеет значение.

Универсальная версия:

SELECT (SELECT COUNT(*) FROM A LEFT JOIN B ON A.x = B.x) 
+ (SELECT COUNT(*) FROM B LEFT JOIN A ON B.x = A.x WHERE A.x IS NULL)
AS outerJoinSize
;

Примечание: я изменил ПРАВОЕ СОЕДИНЕНИЕ на ЛЕВОЕ СОЕДИНЕНИЕ и поменял местами столы; по моему опыту, RIGHT JOIN просто усложняет чтение запросов (особенно когда используется несколько объединений).


Совершенно другая альтернатива ...

SELECT 
( SELECT SUM(dc1.c * IFNULL(ac1.c, 1)) AS jc
  FROM (SELECT name, COUNT(*) AS c FROM directors GROUP BY name) AS dc1 
  LEFT JOIN (SELECT name, COUNT(*) AS c FROM actors GROUP BY name) AS ac1
     ON dc1.name = ac1.name)
+ (SELECT SUM(IF(dc2.name IS NULL, ac2.c, 0)) AS jc
   FROM (SELECT name, COUNT(*) AS c FROM actors GROUP BY name) AS ac2
   LEFT JOIN (SELECT name, COUNT(*) AS c FROM directors GROUP BY name) AS dc2 
      ON ac2.name = dc2.name)

... это вычисляет, сколько совпадений основано на поле объединения (3 экземпляра «Боба» в режиссерах и 2 в актерах означают 6 результатов объединения для этого имени).

0 голосов
/ 07 сентября 2018

Я не уверен, что вы получаете с full join. Но лучший способ реализовать это в MySQL - это два left join s и union:

select count(*)
from ((select name from directors) union -- on purpose
      (select name from actors)
     ) da left join
     directors d
     on da.name = d.name left join
     actors a
     on da.name = a.name;

Если бы мне нужно было угадать, вам просто нужно количество разных имен между двумя таблицами. Если так:

select count(*)
from ((select name from directors) union -- on purpose
      (select name from actors)
     ) da 
0 голосов
/ 07 сентября 2018

Так как есть два name столбца, один из которых directors таблица, другой из actors таблица, и вы select *, что позволит механизму БД перепутать, какое имя вы хотели получить.

если вы хотите только count общее число, вы можете попробовать это.

SELECT COUNT(*) FROM 
(
    SELECT directors.name FROM directors LEFT OUTER JOIN actors
        ON directors.name = actors.name
    UNION
    SELECT directors.name FROM directors RIGHT OUTER JOIN actors
        ON directors.name = actors.name
) table1;

ПРИМЕЧАНИЕ

Я бы предложил использовать select очистить столбцы иизбегать использования select *

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