[MySQL] Помогите составить запрос
select id, f from t1,
(select max(F) max_f, min(F) min_f from t2)
where (f<max_f) and (f>min_f)
ЗЫ Я не уверен, что на MySQL так можно
хотя енто мб от БД зависит
Вложенные селекты не работают на серверах хостинг-провайдеров.
у нормальных людей все пашет
ЗЫ и без всяких говно-мусклов
ЗЫ а они только в from'ах не пашут или в where тоже?
create temp table t1 (f integer);
create temp table t2 (f integer);
insert into t1 values (4);
insert into t1 values (6);
insert into t1 values (10);
insert into t1 values (14);
insert into t1 values (-1);
insert into t1 values (-3);
insert into t2 values (1);
insert into t2 values (3);
insert into t2 values (4);
insert into t2 values (6);
insert into t2 values (8); --max
insert into t2 values (0); --min
-- must be 4,6
select distinct t1.f from t1, t2 where t1.f < t2.f intersect select distinct t1.f from t1, t2 where t1.f > t2.f;
f
---
4
6
(2 rows)
PS это для постгреса
для мускула убрать temp из create table (хоть intersect-то мускул умеет делать )
PPS хотя че-то у меня какое-то странное чуйство по поводу ентого запроса - надо подумать
PPPS вроде все верно, хотя под конец рабочего дня башка не варит
ERROR 1248 (42000): Every derived table must have its own alias
Так что правильно говорит, что нужно вложенному селекту "дать имя". А как это сделать на MySQL, не подскажете?
Твой запрос на MySQL выдаёт ошибку:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'inter
sect select distinct t1.f from t1, t2 where t1.f > t2.f' at line 1
Но попробуй
create alias alias_name as select max(F) max_f, min(F) min_f from t2;
select id, f from t1, alias_name
where (f<max_f) and (f>min_f);
Совсем тупой совет: попробуй в примере скобочки расставить
Много вариантов перепробовал, но всё равно не выходит.
Может кто-нить, знающий достаточно хорошо MySQL, подскажет, подождём
а трудно сделать 2 запроса? Или тут вопрос принципа? В MySQL есть временные таблицы, можно первым запросом во временную таблицу выбрать min и max, второй запрос - тривиален в таком случае.
Напиши плиз второй тривиальный запрос
select @themin := min(F) from T2;
select @themax := max(F) from T2;
select * from T1 where F between @themin and @themax;
Просто для интереса: а одним запросом никак не получится, да?
без вложенного подзапроса никак
Всем спасибо! Тема закрыта.
а то что мускул интерсект не умеет делать - так тогда надо писать, что в мускуле нельзя, а не вообще
прочитай как тред называется еще раз и пойми, запросы к какой СУБД мы обсуждаем
CREATE TEMPORARY TABLE m (
id integer,
fmin integer,
fmax integer);
INSERT INTO m SELECT 1, min(a.F max(a.F) from a;
SELECT b.id, b.F FROM b,m WHERE m.id=1 AND b.F<m.fmax AND b.F>m.fmin
Вместо положенных двух строк выдаёт такое:
Query OK, 0 rows affected (0.05 sec)
Query OK, 1 row affected, 2 warnings (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 2
Empty set (0.00 sec)
mysql> select * from a;
+----+---+
| id | F |
+----+---+
| 1 | 1 |
| 2 | 3 |
| 3 | 4 |
| 4 | 6 |
| 5 | 8 |
| 6 | 0 |
+----+---+
6 rows in set (0.00 sec)
mysql> select * from b;
+----+----+
| id | F |
+----+----+
| 1 | 4 |
| 2 | 6 |
| 3 | 10 |
| 4 | 14 |
| 5 | -1 |
| 6 | -3 |
+----+----+
6 rows in set (0.00 sec)
mysql> CREATE TEMPORARY TABLE m (
-> id integer,
-> fmin integer,
-> fmax integer);
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql> INSERT INTO m SELECT 1, min(a.F max(a.F) from a;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT b.id, b.F FROM b,m WHERE m.id=1 AND b.F<m.fmax AND b.F>m.fmin;
+----+---+
| id | F |
+----+---+
| 1 | 4 |
| 2 | 6 |
+----+---+
2 rows in set (0.00 sec)
Что я делаю не так?
У меня тип поля F просто не integer, а date. Забыл поменять.
Спасибо.
Оставить комментарий
veiler
Есть база данных db с двумя таблицами: 1 и 2:В таблицах 1 и 2 по два поля: Id и F.
Требуется написать запрос, возвращающий все строки таблицы 1, значение в поле F в которых находится между максимальным и минимальным значением поля F в таблице 2.
Как?