2016-08-06 2 views
0
SELECT * 
FROM a 
WHERE a.re_id = 3443499 
AND a.id IN 
(
    SELECT b.rsp_id FROM b 
    WHERE b.f_id = 9 
    GROUP BY b.rsp_id 
    HAVING FIND_IN_SET(16, GROUP_CONCAT(b.o_id)) > 0 
    AND FIND_IN_SET(15, GROUP_CONCAT(b.o_id)) > 0 

    UNION 

    SELECT b.rsp_id FROM b 
    WHERE b.f_id = 4 
    GROUP BY b.rsp_id 
    HAVING FIND_IN_SET(5, GROUP_CONCAT(b.o_id)) > 0 
) 
ORDER BY id DESC 

Здесь «f_id» - это массив, а его значения указаны в первом параметре функции «FIND_IN_SET». НапримерЕсть ли лучший способ сделать этот запрос?

9=>(
16, 
15 
), 
4=>(
5 
) 

Пример данных для этих 2 folumns в таблице б, 2 колонки F_ID и O_ID

f_id o_id 
9 15 
9 18 
9 23 
4 5 
3 8 
+0

Я имею в виду его входной вход пользователя как массив из формы. –

+0

Да, в таблице b –

+0

Добавлено больше текста вопроса. –

ответ

0

Суть этого ответа заключается в том, что текущий запрос не выполняется. Итак, исправьте синтаксис и задайте вопрос еще один вопрос.

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

Во-вторых, используйте UNION ALL вместо UNION, если только вы специально не хотите нанести накладные расходы на удаление дубликатов.

В-третьих, ORDER BY сгенерирует ошибку.

В-четвертых, GROUP_CONCAT() является опасным и ненужным.

Я не 100% уверен, что это намерение, но я хотел бы начать с запросом, как это:

SELECT a.id, a.re_id 
FROM a 
WHERE a.re_id = 3443499 AND 
     a.id IN (SELECT b.rsp_id 
       FROM b 
       WHERE b.f_id = 9 
       GROUP BY b.rsp_id 
       HAVING MAX(b.o_id = 16) > 0 AND 
         MAX(b.o_id = 15) > 0 
      ) 
UNION ALL 
SELECT b.rsp_id, NULL 
FROM b 
WHERE b.f_id = 4 
GROUP BY b.rsp_id 
HAVING MAX(b.o_id = 5) > 0 
ORDER BY id; 

Затем, если вы хотите, это оптимизированное, я предложил бы просить другой вопрос, наряду с соответствующей информацией о структурах таблиц и текущей производительности.

+0

O Да, этот порядок был просто id, а не a.id "a." добавлен при публикации этого вопроса. Но все же цель союза/всех заключалась в том, чтобы получить эти rsp_id, и в вашем ответе союз совершенно другой? –

Смежные вопросы