Mysql Query сомнения

0

У меня есть три таблицы: test1, test2, test3

test1 data
===========
id test_id q_id 
1    25      2
2    27      2

test2 data
===========
id test_id q_id 
1    25      2
2    34      2

test3 data
===========
id test_id q_id 
1    34      2

как получить test_id значение с q_id = 2 из этих трех таблиц без повторения данных?

что составляет 25, 27, 34

  • 2
    Почему у вас есть 3 таблицы с одинаковыми столбцами? Разве это не было бы лучше, если бы использовалась одиночная test таблица с дополнительным столбцом для дифференциации между 3 прогонами теста?
Теги:

3 ответа

2
Лучший ответ

Если вы действительно не можете избавиться от двух из трех структурных идентичных таблиц, посмотрите на UNION. По умолчанию используется UNION DISTINCT, который удаляет дубликаты из результатов.

  SELECT test_id FROM test1 WHERE q_id=2
UNION DISTINCT
  SELECT test_id FROM test2 WHERE q_id=2
UNION DISTINCT
  SELECT test_id FROM test3 WHERE q_id=2   
  • 0
    это из руководства по mysql (и действительно, это поведение, предписанное стандартом SQL): поведение UNION по умолчанию состоит в том, что из результата удаляются повторяющиеся строки. Необязательное ключевое слово DISTINCT не имеет никакого эффекта, кроме значения по умолчанию, поскольку оно также указывает удаление дублирующихся строк.
  • 0
    Да, это поведение по умолчанию (как уже упоминалось в ответе), и также не вредно явно вписывать его в запрос (для ясности).
1

@just somebody - ваш запрос делает 3 select *, который может быть интенсивным, лучше всего ограничить все три, чтобы избежать ненужного количества строк:

    SELECT test_id, 'test1' AS tableName FROM test1 WHERE q_id = 2
    UNION
    SELECT test_id, 'test2' AS tableName FROM test2 WHERE q_id = 2
    UNION
    SELECT test_id, 'test3' AS tableName FROM test3 WHERE q_id = 2

Вышеупомянутый запрос был изменен, чтобы отобразить таблицу, из которой каждый q_id пришел.

  • 0
    В чем причина обертывания вещи в подзапрос?
  • 0
    Разве база данных не достаточно умна, чтобы понять, что нужен только test_id? я думал, что MySQL немного вырос с 3,22 дней ... вздох.
Показать ещё 1 комментарий
0
SELECT test_id
FROM (
    SELECT * FROM test1 UNION
    SELECT * FROM test2 UNION
    SELECT * FROM test3
) tests
WHERE q_id = 2
  • 0
    ВЫБЕРИТЕ DISTINCT test_id ...
  • 3
    Этот запрос может привести к ненужным затратам, если вы работаете с большими таблицами. Смотрите решение ниже.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню