MySQL - не удается получить максимальное значение в левом соединении и двух отдельных периметрах - PullRequest
1 голос
/ 27 сентября 2019

Я использую MySql 5.6 , и у меня есть 2 таблицы (упрощенные для сокращения nb столбцов до значения, которое имеет значение для этого вопроса) с запросом, который использует сегодня LEFT JOIN для выбора строк.

Вот скрипка для проверки вашего решения: https://www.db -fiddle.com / f / nGVFhr3xMwKk9CDw6N6FWc / 13

Таблица 'query_results'

+-----------------------------+------------+--------------+-----------
| query_result_id             | query_id   | author       |  datecol
+-----------------------------+------------+--------------+-----------
| 100                         |         1  | john         |   80
| 101                         |         1  | eric         |   70
| 102                         |         2  | emily        |   100
| 103                         |         2  | emily        |   100
| 104                         |         4  | emily        |   120
| 105                         |         3  | emily        |   50
+-----------------------------+------------+--------------+-----------

Таблица 'Customers_emails'

+-------------------+-----------------+--------------+-----------+-------------+
| customer_email_id | query_result_id | customer_id  | author    |  email_nb 
+-------------------+-----------------+--------------+-----------+-------------+
| 5                 |         758     | 12           |  mathew   |   0  
| 12                |         102     | 12           |  emily    |   0     
| 13                |         103     | 12           |  emily    |   1
| 14                |         104     | 12           |  emily    |   9
| 15                |         102     | 7            |  emily    |   2
+-------------------+-----------------+--------------+-----------+-------------+

Мой текущий запрос успешно извлекает все query_results для данного query_id = 2 и данного customer_id = 12 и некоторых другихнезначительные ограничения (такие как datecol> 30).

  SELECT            
    qr.query_result_id,
    qr.query_id,
    qr.author
  FROM
    query_results qr
  LEFT JOIN
    customers_emails coe
  ON
    qr.author = coe.author AND
    coe.customer_id = 12           
  WHERE        
    qr.query_id = 2 AND
    qr.datecol >= 30 AND
    qr.author IS NOT NULL            
      AND qr.author NOT IN (
        SELECT author
        FROM customers_emails
        WHERE 
          (
            customer_id = 12 AND
            email_nb = 3
          )
      )
  GROUP BY
    qr.author
  ORDER BY 
    qr.query_result_id ASC
  LIMIT 
    2

Этот запрос выше работает отлично (я удовлетворен) и дает мне:

Сегодня Мой вывод:

+-------------------+-----------------+--------------+
| query_result_id   | query_id        | author       | 
+-------------------+-----------------+--------------+
| 102               |         2       | emily        |                 
+-------------------+-----------------+--------------+

Теперь моя цель и где я терплю неудачу: я просто хочу добавить новый столбец с именем max_email_nb к текущему выводу, который будет ** "самым высоким email_nb отправлено

  • по заданному customer_id (= 12)
  • по этому заданному query_id (= 2)
  • до author f каждой строкииз текущего вывода SQL, в приведенном выше примере это emily (но может быть больше строк, и его нельзя предсказать: оно исходит из текущего запроса!) **

Я пыталсяиспользуйте MAX ():

      SELECT            
        qr.query_result_id,
        qr.query_id,
        qr.author,
        MAX(coe.email_nb) as max_email_nb
      FROM
        query_results qr
      LEFT JOIN
        customers_emails coe
      ON
        qr.author = coe.author AND
        coe.customer_id = 12           
      WHERE        
        qr.query_id = 2 AND
        qr.datecol >= 30 AND
        qr.author IS NOT NULL            
          AND qr.author NOT IN (
            SELECT author
            FROM customers_emails
            WHERE 
              (
                customer_id = 12 AND
                email_nb = 3
              )
          )
      GROUP BY
        qr.author
      ORDER BY 
        qr.query_result_id ASC
      LIMIT 
        2

Сегодня мой вывод:

+-------------------+-----------------+--------------+-----------------+-------------
| query_result_id   | query_id        | author       |  max_email_nb   | ... 
+-------------------+-----------------+--------------+-----------------+------------
| 102               |         2       | emily        |  9              |                
+-------------------+-----------------+--------------+-----------------+------------

Неправильное значение в max_email_nb : в зависимости от того, что я собираюсь сделать, яожидайте, что значение max_email_nb будет равно 1 вместо 9.Я ожидаю вывод:

+-------------------+-----------------+--------------+-----------------+-------------
| query_result_id   | query_id        | author       |  max_email_nb   | ... 
+-------------------+-----------------+--------------+-----------------+------------
| 102               |         2       | emily        |  1              |                
+-------------------+-----------------+--------------+-----------------+------------

Действительно, я хочу получить для каждого query_result, который выводится моим SQL-запросом, наибольшее значение email_nb, отправленное given Customer_id 12 на query_id 2 этому author (в этой конкретной строке из текущего SQL-запроса это emily).

Так откуда взялась эта неправильная величина 9?Он поступает из этой строки ввода:

+-------------------+-----------------+--------------+-----------+-------------+
| customer_email_id | query_result_id | customer_id  | author    |  email_nb   | 
+-------------------+-----------------+--------------+-----------+-------------+
| 14                |         104     | 12           |  emily    |   9  

... поэтому он связан с query_result_id= 104, что само по себе определено здесь:

+-----------------------------+------------+--------------+-----------
| query_result_id             | query_id   | author       |  datecol
+-----------------------------+------------+--------------+-----------
| 104                         |         4  | emily        |   120

... так что это с query_id = 4!Но, как я уже сказал при определении цели, я искал что-то, связанное с query_id = 2, поэтому я не должен получить 9, а значение 1!

Вот скрипка для тестированияВаше решение: https://www.db -fiddle.com / f / nGVFhr3xMwKk9CDw6N6FWc / 13

Я пробовал подзапросы, пробовал внутренние объединения ... но ничего не работает.

Ответы [ 3 ]

1 голос
/ 30 сентября 2019

Это должно дать вам то, что вы хотите, без недетерминированной логики LIMIT.

SELECT            
    qr.query_result_id,
    qr.query_id,
    qr.author,
    MAX(coe.email_nb)
  FROM
    query_results qr
  LEFT JOIN
    customers_emails coe
  ON
    qr.author = coe.author AND
    qr.query_result_id = coe.query_result_id AND
    coe.customer_id = 12      
  WHERE        
    qr.query_id = 2 AND
    qr.datecol >= 30 AND
    qr.author IS NOT NULL            
      AND qr.query_result_id NOT IN (
        SELECT query_result_id
        FROM customers_emails
        WHERE 
          (
            customer_id = 12 AND
            email_nb = 3
          )
      )
  ORDER BY 
    qr.query_result_id ASC

Вы можете взглянуть на результат Fiddle .

enter image description here


Дополнительная информация:

Причина, по которой у вас было 9 вместо 1 потому что ваше LEFT JOIN условие было недостаточным.

Вы присоединились только к совпадению AUTHOR в обоих столбцах, но emily также имеет запись с email_nb, равным 9.

Чтобы получить правильный результат, вы также должны были присоединиться на основе QUERY_RESULT_ID, чтобы ограничить emily только результатами запроса, которые 102.

1 голос
/ 30 сентября 2019

Похоже, вы пропустили предложение в ON выражении.Будет ли это работать?

  SELECT            
    qr.query_result_id,
    qr.query_id,
    qr.author,
    MAX(coe.email_nb) as max_email_nb
  FROM
    query_results qr
  LEFT JOIN
    customers_emails coe
  ON
    qr.author = coe.author AND
    qr.query_result_id = coe.query_result_id
  WHERE        
    qr.query_id = 2 AND
    qr.datecol >= 30 AND
    qr.author IS NOT NULL            
      AND qr.author NOT IN (
        SELECT author
        FROM customers_emails
        WHERE 
          (
            customer_id = 12 AND
            email_nb = 3
          )
      )
  GROUP BY
    qr.author
  ORDER BY 
    qr.query_result_id ASC
  LIMIT 
    2
0 голосов
/ 30 сентября 2019

Я попробовал это на скрипке, и это сработало как шарм,

Вы также можете попробовать это.

SELECT            
    qr.query_result_id,
    qr.query_id,    
    qr.author,
    MAX(coe.email_nb) as max_email_nb
  FROM
    query_results qr
  LEFT JOIN
    customers_emails coe
  ON
    qr.author = coe.author  
    and coe.customer_id = 12
    and qr.query_result_id = coe.query_result_id
  WHERE 
    qr.query_id = 2 AND
    qr.datecol >= 30 AND
    qr.author IS NOT NULL            
      AND qr.query_result_id NOT IN (
        SELECT query_result_id
        FROM customers_emails
        WHERE 
          (
            customer_id = 12 AND
            email_nb = 3
          )
      )
  GROUP BY
    qr.author
  ORDER BY 
    qr.query_result_id ASC
  LIMIT 
    20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...