Сложный выбор MYSQL-запроса из двух таблиц

0

Мне нужно сделать запрос MYSQL для выбора пользователей из "table_in", который имеет тот же формат, что и table_1

 table_1
 id  Field_id  user_id  value
 1      9        1     "hello"
 2      10       1     "Multi"
 3      9        2     "Something"
 4      10       2     "Single"

 table_2
 id  user_id  status        specs
 1      1     "Busy"       "this is a test"
 2      2     "Idle"       "this is another test"
 3      2     "Busy"       "another test again"
 4      1     "Relaxing"   "something else"

Мне нужно выбрать пользователей из table_in, где выполняется одно из следующих значений:

  1. table_1 field_id = 10 содержит "Multi"
  2. table_2 статус НЕ занят

Затем сохраните результат в новой таблице table_out

Так что я до сих пор это

  CREATE TEMPORARY TABLE table_out
    SELECT * FROM table_1 WHERE user_id in (SELECT user_id from table_in) 
    AND (field_id=10 AND value='Multi')
    OR (SELECT * from table_2 where status!='Busy')

Я не эксперт SQL и оператор MY-SQL, который у меня выше, не работают. Я думаю, может быть, последний оператор OR неверен, когда он пытается выбрать из таблицы_2, где статус не занят.

Таким образом, в основном пользователи, которые попадают в table_out, должны все исходить из "table_in" и либо иметь (поле 10 установлено несколько), либо тот же пользователь в таблице_2 (статус! = Занят)

Кто-нибудь знает, как это сделать?

UPDATE: нашел мое собственное решение. Используя table_in, создайте вторую таблицу, выбрав только те значения из нее, которые не являются "мульти", а затем из этой таблицы запросов_2 для тех пользователей user_id, которые не заняты, помещают их в другую таблицу, а затем удаляют эти значения из table_in.

Спасибо, в любом случае

  • 0
    Итак, есть ли на самом деле 3 таблицы здесь? table_in , table_1 и table_2 ?
  • 0
    да, table_in содержит реальных пользователей, затем из этих пользователей вы смотрите в table_1 и table_2, чтобы увидеть, содержит ли там информация, соответствующая пользователям в table_in, поле 10 = multi или у того же пользователя статус table_2 не занят. Таким образом, вы можете использовать только user_ids в table_in
Показать ещё 1 комментарий
Теги:

4 ответа

1

Вы можете попробовать его с помощью утверждения union. У меня нет базы данных mysql, чтобы протестировать ее, но она должна выглядеть примерно так:

-- since table_in is a temporary table, we need to copy it first.
CREATE TEMPORARY TABLE table_in2 SELECT * FROM table_in;

CREATE TEMPORARY TABLE table_out SELECT table_out_alias.*
                             FROM (
                                    SELECT
                                      user_id AS user_id,
                                      value   AS value,
                                      ''      AS specs
                                    FROM table_1
                                    WHERE user_id IN (SELECT user_id
                                                      FROM table_in)
                                          AND (field_id = 10 AND value = 'Multi')
                                    UNION ALL
                                    SELECT
                                      user_id AS user_id,
                                      ''      AS value,
                                      specs   AS specs
                                    FROM table_2
                                    WHERE status != 'Busy' AND user_id IN (SELECT user_id
                                                                           FROM table_in2)
                                  ) AS table_out_alias

если я правильно понял ваш вопрос :)

  • 0
    все еще проверяю спасибо!
  • 0
    просто интересно, почему у вас там одинарные кавычки во второй строке после значения и в последней строке после user_id? Спасибо!
Показать ещё 11 комментариев
0

Я думаю, вы обнаружите, что это делает то, что вы ищете:

SELECT *
  FROM table_in ti
  INNER JOIN table_1 t1
    ON t1.user_id = ti.user_id
  LEFT OUTER JOIN table_2 t2
    ON t2.USER_ID = ti.USER_ID
  WHERE (t1.field_id = 10 AND t1.value = 'Multi') OR
        t2.status <> 'Busy'

Чтобы эта работа была запланирована, table_2 должна быть внешним (необязательным) соединением. На самом деле, поскольку я не полностью понимаю проблему, вполне возможно, что BOTH table_1 и table_2 должны быть внешними объединениями. Ну, это еще кое-что для вас, чтобы поиграть.

Я должен был сделать некоторые предположения, которые я инкапсулировал в этот SQLFiddle. Обратите внимание, что в table_in я table_in только user_id из 1, чтобы проверить его. Измените его по мере необходимости, чтобы проверить дальше.

Удачи.

РЕДАКТИРОВАТЬ

Код скрипта:

create table table_in(user_id int);

insert into table_in(user_id) values (1);



create table table_1(id int, field_id int, user_id int, value varchar(20));

 insert into table_1 (id,  Field_id,  user_id,  value) values (1,      9 ,       1,     'hello');
 insert into table_1 (id,  Field_id,  user_id,  value) values (2,      10,       1,     'Multi');
 insert into table_1 (id,  Field_id,  user_id,  value) values (3,      9 ,       2,     'Something');
 insert into table_1 (id,  Field_id,  user_id,  value) values (4,      10,       2,     'Single');

 create table table_2 (id int, user_id int, status varchar(10), specs varchar(25));

insert into table_2(id,  user_id,  status, specs) value (1,      1,     'Busy'     ,  'this is a test');
insert into table_2(id,  user_id,  status, specs) value ( 2,      2,     'Idle'     ,  'this is another test');
insert into table_2(id,  user_id,  status, specs) value ( 3,      2,     'Busy'     ,  'another test again');
insert into table_2(id,  user_id,  status, specs) value ( 4,      1,     'Relaxing' ,  'something else');

Поместите его здесь, потому что SQLFiddle, кажется, идет и выходит, как мяч для пинг-понга. :-(

  • 0
    спасибо за помощь, выдал ошибку: дубликат ID столбца
  • 0
    Ну, возможно, это то, над чем ты можешь работать. Удачи.
0

Вы должны использовать оператор UNION ALL.

Оператор UNION используется для объединения результирующего набора из двух или более операторов SELECT.

  • Каждый оператор SELECT в UNION должен иметь одинаковое количество столбцов
  • Столбцы также должны иметь похожие типы данных

  • Столбцы в каждой инструкции SELECT также должны быть в одном порядке.

    CREATE TEMPORARY TABLE table_out
    SELECT * FROM table_1 WHERE user_id in (SELECT user_id from table_in) AND (field_id=10 AND value='Multi')
    

Оператор UNION по умолчанию выбирает только разные значения. Чтобы разрешить повторяющиеся значения, используйте UNION ALL

UNION ALL
    SELECT t2.id, t_in.field_id, t2.user_id, t_in.value
    FROM table_2 AS t2
    INNER JOIN table_in AS t_in
    ON t2.user_id = t_in.user_id
    WHERE t2.status != 'Busy';
  • 0
    выдал ошибку: не могу открыть таблицу
  • 0
    Я объединил ваш главный код и второй код, затем получил эту ошибку
Показать ещё 1 комментарий
0

Из того, что я вижу... может быть, что-то вроде этого будет работать... Конечно, я SQL Server, но я думаю, что это сработает в MySQL.

Select t1.*
From Table_in TIN
JOIN Table_1 T1 ON TIN.User_ID = T1.User_ID
JOIN Table_2 T2 ON TIN.User_ID = T2.User_ID
Where (T1.Field_ID = 10 AND T1.Value = 'Multi')
OR (T2.Status != 'Busy')
  • 0
    Что делает SELECT t1. *?
  • 0
    Только выбирает столбцы из Table_1 псевдонимом T1
Показать ещё 5 комментариев

Ещё вопросы

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