[MySQL] Помогите составить запрос

veiler

Есть база данных db с двумя таблицами: 1 и 2:

1: Id F 2: Id F
+----+---------+ +----+---------+
| | | | | |
| | | | | |
| | | | | |
| | | | | |
| | | | | |
+----+---------+ +----+---------+

В таблицах 1 и 2 по два поля: Id и F.
Требуется написать запрос, возвращающий все строки таблицы 1, значение в поле F в которых находится между максимальным и минимальным значением поля F в таблице 2.
Как?

Realist

Попробуй
 
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 так можно

zya369

я б для уверенности вложенному селекту имя дал...
хотя енто мб от БД зависит

avinir60

Вложенные селекты не работают на серверах хостинг-провайдеров.

zya369

бля ацтой
у нормальных людей все пашет
ЗЫ и без всяких говно-мусклов

zya369

ЗЫ а они только в from'ах не пашут или в where тоже?

zya369


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 вроде все верно, хотя под конец рабочего дня башка не варит

veiler

На это выдаёт ошибку:
ERROR 1248 (42000): Every derived table must have its own alias  

Так что правильно говорит, что нужно вложенному селекту "дать имя". А как это сделать на MySQL, не подскажете?

veiler

Насчёт intersect сомнения
Твой запрос на 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

Realist

Не подскажу. Я только по Ораклу, да и по нему чайник.
Но попробуй

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);

Совсем тупой совет: попробуй в примере скобочки расставить

veiler

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

Fragaria

а трудно сделать 2 запроса? Или тут вопрос принципа? В MySQL есть временные таблицы, можно первым запросом во временную таблицу выбрать min и max, второй запрос - тривиален в таком случае.

veiler

Напиши плиз второй тривиальный запрос

rosali

 
select @themin := min(F) from T2;
select @themax := max(F) from T2;
select * from T1 where F between @themin and @themax;

veiler

Спасибо!
Просто для интереса: а одним запросом никак не получится, да?

anton7805

без вложенного подзапроса никак

veiler

OK.
Всем спасибо! Тема закрыта.

zya369

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

anton7805

прочитай как тред называется еще раз и пойми, запросы к какой СУБД мы обсуждаем

Fragaria


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

veiler

Не очень что-то работает
Вместо положенных двух строк выдаёт такое:
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)

Fragaria

 
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)

Что я делаю не так?

veiler

Всё правильно, это я сглючил, сорри
У меня тип поля F просто не integer, а date. Забыл поменять.
Спасибо.
Оставить комментарий
Имя или ник:
Комментарий: