Задавайте вопросы, мы ответим
Вы не зашли.
Есть 2 таблицы
первая справочник:
id_ops - номер операции
name_ops - имя операции
вторая таблица с данными:
id_ops
summa
...
как мне получить данные номера и имени операции из 2 этих таблиц так, что бы если в таблице информации есть уже заполненные данные то получить операции, которых нет в таблице информации?
делал так
select id_ops, name_ops from sprav_ops where id_ops in (select id_ops from plan where id_month=8 and id_year=2009 and fil_id=12)
но ничего не получается.
хелп, плиз.
Неактивен
если первая таблица sprav_ops, а вторая plan, то
Неактивен
Вопрос не понял
Вам нужно что-то такое?
SELECT s.*
FROM sprav_ops s
LEFT JOIN plan p USING (id_ops)
WHERE p.id_ops IS NULL
Неактивен
Вася чуток опередил Но, видимо, вопрос я понял правильно
Неактивен
спасибо за ответы, но при таком коде дает ошибку:
ERROR 1052: Column: 'id_ops' in field list is ambiguous
Единственная моя догадка - во второй таблице поле id_ops должно быть первым - это так?
Неактивен
pixel написал:
Единственная моя догадка - во второй таблице поле id_ops должно быть первым - это так?
Нет. В списке выбираемых полей в моем запросе не было указано из какой таблицы берется id_ops.
Запрос Паулюса написан правильно.
Неактивен
pixel написал:
УРЯ!!! заработала! Спасибо большое!
Чуть позже: а что собственно заработало? код то прошел но вернул то он не то что нужно. Как мне прикрутить другие параметры: т.е. если во второй таблице данные уже есть, то выбрать из первой все записи за исключением тех, что есть во второй.
Отредактированно pixel (18.08.2009 20:35:17)
Неактивен
О каких других параметрах идет речь?
Данный запрос возвращает вам те строки из первой таблицы (sprav_ops), у которых id_ops не равен id_ops, встречающемуся во второй таблице.
Или вам нужно что-то другое?
Неактивен
в первом посте указаны параметры второй таблицы. а то что возвращается вами предложенный код (да он работает) но есть во второй таблицы данные повторяются из месяца в месяц - результат возвращается неверный. т.е. допустим во вторую таблицу завели данные, но не все, и что бы их не сортировать, нужно показать только те, которые не заведены - а взять их нужно из первой таблицы - справочника, т.к. там данные все время одинаковы.
Неактивен
Оно так и делает. Если Вы напишете полную структуру таблиц и ограничения,
которые Вы накладываете на вторую таблицу, будет попроще. Кстати, тогда
и запрос сами сможете написать. Пока что есть ощущение, что Вы хотите добавить
что-то типа «WHERE p.date > ...»
Неактивен
Если я правильно вас понимаю, то вы хотите выбрать не те данные из первой таблице, которые не имеют соответствия во второй, а те данные из первой таблицы, которые не имеют соответствия в части второй таблицы (например, данные за последний месяц, и т.д.).
SELECT s.*
FROM sprav_ops s
LEFT JOIN (SELECT * FROM plan WHERE ваши_условия_на_выбор_части_второй_таблицы) p USING (id_ops)
WHERE p.id_ops IS NULL
Неактивен
пишет ошибка синтаксиса
create table sprav_ops
( id_Ops tinyint unsigned not null auto_increment primary key,
Name_Ops char(150) not null,
Params char(10) not null,
FIL_NO smallint unsigned not null
);
create table plan
( id_counter smallint unsigned not null auto_increment primary key,
Id_Month tinyint unsigned not null,
Id_Year smallint unsigned not null,
Id_Ops smallint unsigned not null,
Summa float(8,2)
);
вот что я пишу:
SELECT s.*
FROM sprav_ops s
LEFT JOIN (SELECT * FROM plan WHERE id_month=8 and id_year=2009 and fil_id=12) p USING (id_ops)
WHERE p.id_ops IS NULL
получаю: ERROR 1064
Отредактированно pixel (18.08.2009 21:24:52)
Неактивен
Приведите полностью запрос и сообщение об ошибке.
Неактивен
запрос выше, а ошибка:
ERROR 1064: You have an error in your SQL syntax near '(select * from plan where id_month=8 and id_year=2009 and fil_no=12) p using (id' at line 1
Неактивен
А версия MySQL какая? неужто 3.23?
Неактивен
именно 3.23.54 - ну не хочу я связываться с новомодными прогами. просто то что старенькое - работает 100% (но там нет поддержки таких вот связок) а то что новое - глючило сплошное!
Отредактированно pixel (18.08.2009 21:47:42)
Неактивен
Ну тогда что ж удивительного, что что-то не работает. Попробуйте хранить все
в текстовых файликах и обрабатывать их с помощью bash + CGI. Очень хорошее
решение
А если серьезно — пора обновляться. Уже пора. Правда. Честно.
--
Сформулируйте четко словами то, что Вы хотите получить. Пример: «У меня во
второй таблице есть много мусора и три важные строки. Три важные строки от
мусора отличаются наличием флага important=1. Я хочу получить список строк
из первой таблицы, которых нет среди не-мусорных строк второй таблицы.
Критерий совпадения строк — одинаковые id».
Неактивен
Уговорили
в первой таблице (справочнике sprav_ops) есть данные
id_ops name_ops
1 Операция 1
2 Операция 2
3 Операция 3
4 Операция 4
5 Операция 5
Во второй таблице (plan) заведены планы по месяцам
id_counter id_month id_year _id_ops fil_id
1 7 2009 1 12
2 7 2009 2 12
3 7 2009 3 12
4 7 2009 4 12
5 7 2009 5 12
6 8 2009 1 12
7 8 2009 2 12
8 8 2009 3 12
так вот мне нужен запрос, что бы вернул мне данные из первой таблицы по типу
id_ops name_ops
4 Операция 4
5 Операция 5
при условии (select * from plan where id_month=8 and id_year=2009 and fil_id=12)
Это реально сделать на 3.23.54?
Неактивен
Ну вот, вы и написали свой запрос:
Неактивен
и в том и в другом запросе одна и та же ошибка:
ERROR 1046: No Database Selected
(Полагаю что речь идет про кусок кода 'LEFT JOIN plan p')
Неактивен
Это не ошибка запроса.
Прежде чем выполнять запрос нужно выбрать базу данных. Например, запросом
Неактивен
paulus написал:
Наверное, надо было сказать: «в 3.23 нельзя»
Нельзя. Он ведь сначала проведет объединение по id_ops и для каждой строки из левой таблицы будет соответствие в правой. Затем наложит ограничения where и на выходе будет пустой результат. :?
Неактивен
Ага, твоя правда, первый запрос действительно не работает. Работает второй:
[silva] root test > insert sprav_ops values (1, 'one', '', 1), (2, 'two', '', 1);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
[silva] root test > insert plan values (1, 8, 2009, 1, 10);
Query OK, 1 row affected (0.00 sec)
[silva] root test > explain SELECT s.* FROM sprav_ops s LEFT JOIN plan p ON (p.id_ops = s.id_ops AND p.id_month=8 AND p.id_year=2009 ) WHERE p.id_ops IS NULL;
+----+-------------+-------+------+---------------+------+---------+------+------+-------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------------------+
| 1 | SIMPLE | s | ALL | NULL | NULL | NULL | NULL | 2 | |
| 1 | SIMPLE | p | ALL | NULL | NULL | NULL | NULL | 1 | Using where; Not exists |
+----+-------------+-------+------+---------------+------+---------+------+------+-------------------------+
2 rows in set (0.00 sec)
[silva] root test > SELECT s.* FROM sprav_ops s LEFT JOIN plan p ON (p.id_ops = s.id_ops AND p.id_month=8 AND p.id_year=2009 ) WHERE p.id_ops IS NULL;
+--------+----------+--------+--------+
| id_Ops | Name_Ops | Params | FIL_NO |
+--------+----------+--------+--------+
| 2 | two | | 1 |
+--------+----------+--------+--------+
1 row in set (0.00 sec)
Неактивен
спасибо за помощь. я уже обработчик на php прикрутил.
Неактивен