Мне нужно сделать запрос 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, где выполняется одно из следующих значений:
Затем сохраните результат в новой таблице 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.
Спасибо, в любом случае
Вы можете попробовать его с помощью утверждения 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
если я правильно понял ваш вопрос :)
Я думаю, вы обнаружите, что это делает то, что вы ищете:
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, кажется, идет и выходит, как мяч для пинг-понга. :-(
Вы должны использовать оператор UNION ALL.
Оператор UNION используется для объединения результирующего набора из двух или более операторов SELECT.
Столбцы также должны иметь похожие типы данных
Столбцы в каждой инструкции 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';
Из того, что я вижу... может быть, что-то вроде этого будет работать... Конечно, я 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')
Table_1
псевдонимом T1
table_in
,table_1
иtable_2
?