MySQL Left Joins - PullRequest
       10

MySQL Left Joins

0 голосов
/ 26 января 2012

РЕДАКТИРОВАТЬ: ОК, думаю, мне нужно быть более ясным - я хотел бы, чтобы результат показывал все «имена», которые появляются в таблице acme, против подсчетов (если таковые имеются) из таблицы результатов.Надеюсь, что это имеет смысл?

У меня огромная проблема, и мой мозг не работает должным образом.

Все, что я хочу сделать, - это в одном выражении через объединение считать числострок для общего поля.

   SELECT name, COUNT(name) as Count FROM acme
   SELECT name, COUNT(name) as Total FROM results

Я уверен, что должно быть что-то вроде этого ...

   SELECT acme.name, COUNT(acme.name) As Count, 
          COUNT(results.name) as Total 
   FROM acme 
   LEFT JOIN results ON acme.name = results.name 
   GROUP BY name 
   ORDERY BY name

Но это не возвращает правильные значения.

Мысли, где я ошибаюсь ... это, я знаю, будет очень и очень очевидно.

H.

Ответы [ 4 ]

2 голосов
/ 26 января 2012

Исходя из ваших отзывов, вы получите то, что вы хотите. Сначала вы должны получить уникальные имена / количество из файла "ACME" ... ТОГДА присоедините это к таблице результатов для подсчета записей из этого, в противном случае вы получите декартово результат подсчетов. Если ACME имел имя «X» 5 раз, а «Results» - «X» 20 раз, то итоговое значение будет равно 100. В результате приведенного ниже запроса на самом деле будет отображаться строка «X», 5, 20, которая выглядит так, как вы ищете для .. (хотя в ACME существует много имен).

Я перешел на левое соединение, если в таблице ACME есть имена, которых нет в таблице RESULTS, они не будут удалены из вашего окончательного ответа

select
      JustACME.Name,
      JustACME.NameCount,
      COALESCE( COUNT( * ), 0 ) as CountFromResultsTable
   from
      ( select a.Name
               count(*) as NameCount
           from
              acme a
           group by
              a.Name ) JustACME

      LEFT JOIN results r
         on JustACME.Name = r.Name
   group by
      JustACME.Name
0 голосов
/ 26 января 2012

Я не понимаю, почему вы запрещаете использовать два утверждения, это просто все усложняет.Единственная причина, по которой я это вижу, - получить два результата в одном ответе.Я не знаю, будет ли последний работать, но я бы попробовал это:

SET @acount = (SELECT count(DISTINCT name) FROM acme);
SELECT count(DISTINCT name) as Total, @acount as Count FROM results

Я бы опубликовал это как один запрос и (надеюсь) вернул правильные результаты.Позвольте мне отметить, что из вашего вопроса не ясно, хотите ли вы знать, как часто каждое имя удваивается, или вы хотите считать уникальные имена.

0 голосов
/ 26 января 2012

Да, ваше объединение (внутреннее или внешнее, не имеет значения) портит ваши результаты.

На самом деле, скорее всего, возвращается произведение строк с одинаковым именем, а не сумма.

То, что вы хотите сделать, это суммировать строки из первой таблицы, суммировать строки из второй таблицы и объединить , что .

Как это:

Select name, a.count as Count, r.count as Total
From (select name, count(*) from acme group by name) a
Left join (select name, count(*) from results group by name) r using (name)
0 голосов
/ 26 января 2012

Похоже, что это из-за соединения, это все равно что твой счетПопробуйте запустить соединение с помощью SELECT * FROM ... и посмотрите на полученную таблицу.Проблема должна быть очевидна оттуда.= D * * тысяча одна

...