SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.08.2009 13:30:22

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Помогите сделать выборку

Есть 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)
но ничего не получается.
хелп, плиз.

Неактивен

 

#2 18.08.2009 14:23:34

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

если первая таблица sprav_ops, а вторая plan, то

select id_ops, name_ops from sprav_ops left join plan p using (id_ops) where p.id_ops is null;

Неактивен

 

#3 18.08.2009 14:23:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

Вопрос не понял smile
Вам нужно что-то такое?

SELECT s.*
FROM sprav_ops s
LEFT JOIN plan p USING (id_ops)
WHERE p.id_ops IS NULL

Неактивен

 

#4 18.08.2009 14:24:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

Вася чуток опередил wink Но, видимо, вопрос я понял правильно smile

Неактивен

 

#5 18.08.2009 19:46:19

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

спасибо за ответы, но при таком коде дает ошибку:
ERROR 1052: Column: 'id_ops' in field list is ambiguous
Единственная моя догадка - во второй таблице поле id_ops должно быть первым - это так?

Неактивен

 

#6 18.08.2009 20:24:52

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

pixel написал:

Единственная моя догадка - во второй таблице поле id_ops должно быть первым - это так?

Нет. В списке выбираемых полей в моем запросе не было указано из какой таблицы берется id_ops.
Запрос Паулюса написан правильно.

Неактивен

 

#7 18.08.2009 20:33:54

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

pixel написал:

УРЯ!!! заработала! Спасибо большое!

Чуть позже: а что собственно заработало? код то прошел но вернул то он не то что нужно. Как мне прикрутить другие параметры: т.е. если во второй таблице данные уже есть, то выбрать из первой все записи за исключением тех, что есть во второй.

Отредактированно pixel (18.08.2009 20:35:17)

Неактивен

 

#8 18.08.2009 20:46:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

О каких других параметрах идет речь?
Данный запрос возвращает вам те строки из первой таблицы (sprav_ops), у которых id_ops не равен id_ops, встречающемуся во второй таблице.

Или вам нужно что-то другое?

Неактивен

 

#9 18.08.2009 20:53:31

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

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

Неактивен

 

#10 18.08.2009 21:11:51

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

Оно так и делает. Если Вы напишете полную структуру таблиц и ограничения,
которые Вы накладываете на вторую таблицу, будет попроще. Кстати, тогда
и запрос сами сможете написать. Пока что есть ощущение, что Вы хотите добавить
что-то типа «WHERE p.date > ...»

Неактивен

 

#11 18.08.2009 21:12:08

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

Если я правильно вас понимаю, то вы хотите выбрать не те данные из первой таблице, которые не имеют соответствия во второй, а те данные из первой таблицы, которые не имеют соответствия в части второй таблицы (например, данные за последний месяц, и т.д.).


SELECT s.*
FROM sprav_ops s
LEFT JOIN (SELECT * FROM plan WHERE ваши_условия_на_выбор_части_второй_таблицы) p USING (id_ops)
WHERE p.id_ops IS NULL

Неактивен

 

#12 18.08.2009 21:20:37

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

пишет ошибка синтаксиса

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)

Неактивен

 

#13 18.08.2009 21:30:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

Приведите полностью запрос и сообщение об ошибке.

Неактивен

 

#14 18.08.2009 21:35:53

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

запрос выше, а ошибка:
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

Неактивен

 

#15 18.08.2009 21:45:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

А версия MySQL какая? неужто 3.23?

Неактивен

 

#16 18.08.2009 21:46:48

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

именно 3.23.54 - ну не хочу я связываться с новомодными прогами. просто то что старенькое - работает 100% (но там нет поддержки таких вот связок) а то что новое - глючило сплошное!

Отредактированно pixel (18.08.2009 21:47:42)

Неактивен

 

#17 18.08.2009 21:50:32

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

Ну тогда что ж удивительного, что что-то не работает. Попробуйте хранить все
в текстовых файликах и обрабатывать их с помощью bash + CGI. Очень хорошее
решение wink

А если серьезно — пора обновляться. Уже пора. Правда. Честно.
--
Сформулируйте четко словами то, что Вы хотите получить. Пример: «У меня во
второй таблице есть много мусора и три важные строки. Три важные строки от
мусора отличаются наличием флага important=1. Я хочу получить список строк
из первой таблицы, которых нет среди не-мусорных строк второй таблицы.
Критерий совпадения строк — одинаковые id».

Неактивен

 

#18 18.08.2009 21:58:48

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

Уговорили smile
в первой таблице (справочнике 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?

Неактивен

 

#19 18.08.2009 22:13:50

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

Ну вот, вы и написали свой запрос:

SELECT s.*
FROM sprav_ops s
LEFT JOIN plan p USING (id_ops)
WHERE p.id_ops IS NULL AND p.id_month=8 AND p.id_year=2009 AND p.fil_id=12


Наверное, надо было сказать: «в 3.23 нельзя» wink

Кстати, многие любят вот такой синтаксис, считая, что он более понятный:
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 AND p.fil_id=12)
WHERE p.id_ops IS NULL

Неактивен

 

#20 18.08.2009 22:21:42

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

и в том и в другом запросе одна и та же ошибка:
ERROR 1046: No Database Selected
(Полагаю что речь идет про кусок кода 'LEFT JOIN plan p')

Неактивен

 

#21 18.08.2009 22:35:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

Это не ошибка запроса.

Прежде чем выполнять запрос нужно выбрать базу данных. Например, запросом

use имя_базы_данных;


Также возможно не выбирать предварительно базу данных, а использовать полные имена в запрсе.
`имя_базы`.`имя_таблицы`.`имя_столбца`

Неактивен

 

#22 18.08.2009 22:44:18

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Помогите сделать выборку

paulus написал:

Наверное, надо было сказать: «в 3.23 нельзя» wink

Нельзя. Он ведь сначала проведет объединение по id_ops и для каждой строки из левой таблицы будет соответствие в правой. Затем наложит ограничения where и на выходе будет пустой результат.  :?

Неактивен

 

#23 19.08.2009 01:30:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите сделать выборку

Ага, твоя правда, первый запрос действительно не работает. Работает второй:

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

Неактивен

 

#24 19.08.2009 12:56:19

pixel
Завсегдатай
Зарегистрирован: 16.04.2009
Сообщений: 39

Re: Помогите сделать выборку

спасибо за помощь. я уже обработчик на php прикрутил.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson