MySQL запрос не возвращает строк - PullRequest
2 голосов
/ 17 декабря 2011

У меня есть две таблицы MySQL.То, что я пытаюсь сделать, это экспортировать информацию, где Значение 1 на 1 меньше, чем Значение 2, И где ID_1 не имеет своих Значений 1 и Значений 2 равных.

Примечание:

  • Поля Значения 1 и 2 являются просто целыми числами.
  • Каждый отдельный ID_A имеет одно и то же Значение_2
  • Если имеется два значения_1которые на единицу меньше, чем Value_2, посмотрите на Value_3 и выберите ту, которая выше
  • Причина, по которой у меня здесь две таблицы, заключается в том, что я собираюсь выводить информацию из обеих таблиц
  • Мы можем написатьсценарий для этого, но мне нужно сделать это в одной команде для получения бонусных баллов (которые, как объявил мой инструктор, возможны) ... я даже не запустил сценарий для этого, так как на самом деле не знаю, как это сделатьчто ...

tableA выглядит так:

ID_1  ID_2
A     A
A     B
B     A
B     B
C     A
C     B
C     C

tableB выглядит так:

ID_1  ID_2  Value_1  Value_2  Value_3
A     A     2        3        NULL
A     B     3        3        NULL
B     A     4        5        NULL
B     B     7        5        NULL
C     A     7        8        98
C     B     3        8        NULL
C     C     7        8        56

Запрос должен возвращать это:

ID_1  ID_2
B     A
C     A

Вот то, что у меня есть до сих пор ... И это не возвращает ни одного хита, что меня смущает.Я полагаю, что это предложение AND после первого оператора WHERE, в котором мне нужно исправить

SELECT CONCAT(...)
  INTO OUTFILE '/tmp/outfile.tab'
       FIELDS TERMINATED BY '\t'
       ESCAPED BY ''
  FROM tableA
 INNER
  JOIN tableB
    ON tableA.ID_1 = tableB.ID_1
   AND tableA.ID_2 = tableB.ID_2
 WHERE tableB.Value_1 - 1 = tableB.Value_2
   AND tableA.ID_1 !=
        ( SELECT DISTINCT
                 ID_1
            FROM tableB
           WHERE ID_1 = tableA.ID_1
             AND Value_1 = Value_2
        )
;

Последнее замечание: все команды мы выполняем через putty, в котором мы можем получить доступ к MySQL

Ответы [ 3 ]

2 голосов
/ 17 декабря 2011

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

Посмотрите на этот пункт:

   AND tableA.ID_1 !=
        ( SELECT DISTINCT
                 ID_1
            FROM tableB
           WHERE ID_1 = tableA.ID_1
             AND Value_1 = Value_2
        )

Подзапрос обязательно всегда вернет либо tableA.ID_1, либо NULL. (Вы понимаете, почему?) Так что сравнение никогда не бывает «верным»; это всегда либо «ложь» (потому что tableA.ID_1 != tableA.ID_1 обязательно «ложь»), либо «ноль / неопределенный» (потому что tableA.ID_1 != NULL «ноль / неопределенный»). Следовательно, этот пункт отфильтровывает все результаты вашего запроса & mdash; независимо от того, что может сказать остальная часть вашего запроса.

1 голос
/ 17 декабря 2011

Я не уверен на 100% в этом вопросе, но если я правильно понял, первую строку таблицы B (строка 25 в http://imgur.com/a/r3Qy5#1) НЕ следует выбирать, потому что ID_1 = A имеет Value_1 = 3 ввторая строка (строка 26 в http://imgur.com/a/r3Qy5#1),, которая совпадает со значением_1 первой строки (строка 25 в http://imgur.com/a/r3Qy5#1).

, поэтому вы можете начать с чего-то вроде

SELECT .... FROM
tableA NATURAL JOIN tableB
WHERE Value_1=Value_2-1
AND Value_2 NOT IN (SELECT tb.Value_1 from tableB AS tb WHERE tb.ID_1=tableB.ID_1)

которая удовлетворяет требованиям № 1 и № 2. Для требования № 3 (если для ID_1 две строки, выберите ту, которая имеет наибольшее значение_3), нам нужно отсортировать ее по Value_3 и обернуть в суперзапрос для группировки:

SELECT .... FROM (
SELECT * FROM
tableA NATURAL JOIN tableB
WHERE Value_1=Value_2-1
AND Value_2 NOT IN (SELECT tb.Value_1 from tableB AS tb WHERE tb.ID_1=tableB.ID_1)
ORDER BY Value_3 DESC
) AS innerview
GROUP BY Value_1,Value_2

, который дает правильный ответ для тестовых данных в вашем примере.

0 голосов
/ 17 декабря 2011

В первую очередь вам придется применить тест для ваших критериев "Value_3", сгруппированных по соответствующей классификации "ID_1" и Value1, value2.Применяя здесь предложение WHERE, вы получаете ваш окончательный набор записей, включающий в себя то, что БЫЛО с наибольшим значением 3 в его наборе результатов.Теперь это снова присоединяется к таблице B СНОВА, но соответствует квалификационным записям.Поскольку COALESCE () изменит любое значение NULL на 0 в первом наборе результатов, предложение JOIN также должно соответствовать этому.Как и в случае групп «A» и «B», где значение Value_3 не применялось, но в группе «C» оно будет иметь действительное значение и предварительно приведет к записи с максимальным значением 98. Этокогда при повторном присоединении к экземпляру "tb2" для TableB во второй раз будет получен правильный ID_2 "A" для этого набора.МОЖЕТ потерпеть неудачу или дать несколько ответов, если у вас было несколько записей ID1, Value1, Value2, Value3.Он вернул бы все экземпляры «ID2» с одинаковыми общими критериями.Вам нужно будет сделать еще один вложенный уровень, чтобы убрать этот уровень различия.

Ваш ответ также должен возвращать "A", "A", 2, 3

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