SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 14.11.2012 01:59:29

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Проверить наличие записи в колонке

Здравствуйте, уважаемые форумчане. В колонке есть описание публикации. Нужно сделать ссылку на публикацию, если описание в нем есть, если описания нет, то делаю просто текст.
На мой взгляд делать запрос и вытаскивать все описание только ради того, чтобы проверить есть ли оно там или нет, не очень хорошо. Подскажите, так ли это и есть ли какой-нибудь способ получить лишь информацию о наличии записи в колонке навроде true false


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#2 14.11.2012 02:08:56

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

Re: Проверить наличие записи в колонке

where `имя колонки` = "" ?

Неактивен

 

#3 14.11.2012 02:15:25

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

запрос такой
select id, title, description from table where .....

записей доволно много получается, в поле description попадает очень много информации, оно самое большое.
Т.е. я получаю все записи и проверю уже они в поле description или нет.
На мой взгляд это не очень разумно, учитывая большое количество записей, поэтому подумал, что может существует способ получить только что-то навроде true false. При этом остальные записи мне нужны. те. скажем title есть всегда но если description не пустой, то я делаю ссылку на страницу, а если пустой то title Только текст

Отредактированно platedz (14.11.2012 02:17:08)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#4 14.11.2012 02:20:25

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

Re: Проверить наличие записи в колонке

select id, title, if(description="",0,1) as `наличие/отсутствие описания` from table where .....

Неактивен

 

#5 14.11.2012 02:24:54

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Спасибо, но так то непонятно а что здесь должно быть. `наличие/отсутствие описания`


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#6 14.11.2012 02:26:43

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Все понял. Спасибо огромное


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#7 14.11.2012 02:57:01

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Подскажите пожалуйста, а можно ли как то получить записи скажем где id='3' и title='тому, чему равен title Данного id'. Т.е. скажем у id='3' title='Новости', но title='Новости', есть также и у id 5,6,7. И нужно получить все записи у которых title равен тому, чему равен title того id в соответствии с которым идет запрос.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#8 14.11.2012 04:01:03

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

Re: Проверить наличие записи в колонке

select .. from `table` where title = (select title from `table` where id=3);

Неактивен

 

#9 15.11.2012 06:06:15

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Здорово. Спасибо большое. Подскажите еще, а можно ли как-то получить только часть записей в одном запросе. Т.е. скажем если из такого запроса

select id, title, description from table where .....

поле description нужно только в начале, те. если результат найдет и выдаст 10 полей, но вывести description  мне нужно только из первого, а в остальных десяти мне нужны только id и title. Могу ли я как-то получить description только в первом по счете результате.

Отредактированно platedz (15.11.2012 06:07:05)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#10 15.11.2012 06:17:18

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

Re: Проверить наличие записи в колонке

Нет, только двумя запросами.

Например, сначала выбрать id и title, а потом для первой пары получить description.

Неактивен

 

#11 15.11.2012 06:23:30

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Ясно. Еще раз спасибо.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#12 16.11.2012 22:47:22

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Подскажите, пожалуйста, а можно ли как-то проверить дублирующиеся поля.
Т.е. скажем есть поле
time - в которое записывается время события
и sob - в которое записывается название/описание события
Есть вероятность, что одно событие может записаться больше одного раза. При этом в одно и тоже время могут произойти разные события и одно событие может происходить в разное время, но не может происходить одно и тоже событие в одно и то же время.
Можно ли как-то проверить что есть несколько рядом в котором все поля одинаковые, для того, чтобы удалить клоны

Отредактированно platedz (16.11.2012 22:51:58)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#13 16.11.2012 22:59:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проверить наличие записи в колонке

Проще всего в таких случаях создать уникальный ключ на связку (time, sob)
http://dev.mysql.com/doc/refman/5.0/en/ … index.html
Если в таблице создать такой ключ, то при попытке вставки такой же пары значений, запрос вернет ошибку.
Если же в таблице уже есть такие пары, то попытка создать такой уникальный ключ вернет ошибку.

Ну а если не хочется таких "глобальностей", то как-то так:
SELECT time, sob FROM t group by time, sob HAVING count(*) > 1


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#14 16.11.2012 23:16:38

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Большое спасибо за ответ.
Если запрос вернет ошибку, то остальные запросы я так понимаю уже обрабатываться не будут, а нужно чтобы игнорировал. Или как?
Кроме прочего, в базе уже есть дублирующиеся поля, только как-то не ясно, как же удалить клоны. Как сделать delete ... или что-то подобное?


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#15 17.11.2012 00:02:51

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проверить наличие записи в колонке

Если запрос вернет ошибку, то остальные запросы я так понимаю уже обрабатываться не будут, а нужно чтобы игнорировал. Или как?

Это от Вашего кода зависит - если в транзакцию все запросы обернуть, то она откатится после первого же запроса, который вернет ошибку. Если же Вы просто последовательно выполняете запросы, при этом не задавая дополнительных условий, чтобы выполнение прервалось в случае ошибки - ну так тогда будет попытка выполнить все запросы...

И посмотрите здесь.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#16 17.11.2012 00:37:52

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Спасибо. С уникальным ключом на связку я еще попробую разобраться.
Но вот как проще решить проблему удаления уже существующих дубликатов, я так и не понял. Описанный по ссылке способ наверно не совсем то, т.к. в обоих полях однозначно есть не мало одинаковых записей, но они должны не совпадать со временем. На данный момент единственным решением мне приходит в голову это получив все записи с группировки, уже удалить их в цикле в зависимости от количества, но может есть какой-то другой способ? Все-таки что-нибудь навроде delete ....

Отредактированно platedz (17.11.2012 00:39:21)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#17 17.11.2012 00:47:54

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

Re: Проверить наличие записи в колонке

Почему способ по ссылке "не совесм то"?
Это кстати, самый простой способ. Через delete будет сложнее.

Неактивен

 

#18 17.11.2012 00:55:32

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проверить наличие записи в колонке

2platedz:
Можно еще так:
CREATE TABLE `table_tmp` SELECT DISTINCT * FROM `table`;
DROP TABLE `table`;
RENAME TABLE `table_tmp` TO `table`;


А что по приведенной ссылке-то Вам не нравится? Вполне себе метод.

Вася, а я как-то видел от тебя решение где можно было примерно так (но посложнее, с подзапросом внутри, поиском как-то не нашёл) :
DELETE FROM t WHERE id NOT IN ( SELECT min(id) FROM t GROUP BY field1, field2);
В PotgreSQL я стабильно такой конструкцией пользуюсь, но MySQL на нее ругается - ибо не может удалить из той таблицы, откуда сейчас выбираем. Если я ничего не путаю - напомни своё решение пожалуйста, там точно в один запрос было.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 17.11.2012 01:20:17

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

Re: Проверить наличие записи в колонке

Извращения практически нет. Подзапрос материализуем во временную таблицу, а дальше стандартный множественный delete
http://dev.mysql.com/doc/refman/5.5/en/delete.html

Для твоего примера, если мы хотим оставить поля с максимальным id в группе (группировка по field1,field2), то

delete t from t  left join (SELECT field1,field2,max(id) id FROM t group by 1,2) t1 using(field1,field2,id) where t1.id is null;

Неактивен

 

#20 17.11.2012 01:56:16

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Способ с созданием дополнительной таблицы описанный здесь http://sqlinfo.ru/forum/viewtopic.php?id=3737 мне честно говоря кажется не самым лучшим.

В остальном

Если я правильно понимаю, то при создании таблицы со связкой  это выглядет так


CREATE TABLE table(
 `sob` TEXT NULL,
    `time` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
  UNIQUE INDEX (sob,time)
)
 


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


ALTER IGNORE TABLE table ADD UNIQUE (sob,time);
 


Вообще нашел достаточно мало понятной для меня информации по вопросу уникальной связки, тч. буду крайне признателен за пояснения с примерами.

Отредактированно platedz (17.11.2012 04:19:25)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#21 17.11.2012 02:35:38

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Проверить наличие записи в колонке

Ок, создаём таблицу, заполняем данными (причем пара (1,1) повторяется! ).

Код:

mysql> create table t_6239(id integer primary key auto_increment, field1 int, field2 int);
Query OK, 0 rows affected (0.11 sec)

mysql> insert into t_6239(field1,field2) values(1,1),(1,2),(2,1),(1,1);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from t_6239;
+----+--------+--------+
| id | field1 | field2 |
+----+--------+--------+
|  1 |      1 |      1 |
|  2 |      1 |      2 |
|  3 |      2 |      1 |
|  4 |      1 |      1 |
+----+--------+--------+
4 rows in set (0.00 sec)

Пробуем "уникализировать" (если так можно сказать smile пару (field1,field2) - естественно mysql отказывается.

Код:

mysql> create unique index field1_2 on t_6239(field1,field2);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'field1_2'

Так что честно удаляем дубли:

Код:

mysql> delete t_6239 from t_6239  left join (SELECT field1,field2,min(id) id FROM t_6239 group by 1,2) t1 using(field1,field2,id) where t1.id is null;
Query OK, 1 row affected (0.00 sec)

Смотрим, что получилось:

Код:

mysql> delete t_6239 from t_6239  left join (SELECT field1,field2,min(id) id FROM t_6239 group by 1,2) t1 using(field1,field2,id) where t1.id is null;
Query OK, 1 row affected (0.00 sec)

mysql> select * from t_6239;                                                                                                  +----+--------+--------+
| id | field1 | field2 |
+----+--------+--------+
|  1 |      1 |      1 |
|  2 |      1 |      2 |
|  3 |      2 |      1 |
+----+--------+--------+
3 rows in set (0.00 sec)

Профит!

Теперь снова пытаемся наложить уникальный индекс на связку field1 и field2

Код:

mysql> create unique index field1_2 on t_6239(field1,field2);
Query OK, 3 rows affected (0.13 sec)
Records: 3  Duplicates: 0  Warnings: 0

Снова профит - ключ (ограничение) успешно наложилось.
Теперь у нас не получится вставить еще один дубль.

Код:

mysql> insert into t_6239(field1,field2) values(2,1);
ERROR 1062 (23000): Duplicate entry '2-1' for key 'field1_2'

Профит.


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

Код:

mysql> CREATE TABLE `t_6239_uniq` (   `id` int NOT NULL AUTO_INCREMENT,   `field1` int(11) DEFAULT NULL,   `field2` int(11) DEFAULT NULL,   PRIMARY KEY (`id`),   UNIQUE KEY `field1_2` (`field1`,`field2`) );
Query OK, 0 rows affected (0.25 sec)

И теперь на попытку вставить дублирующиеся по field1 и field2 записи, естественно, будет отказ

Код:

mysql> insert into t_6239_uniq(field1,field2) values(2,1),(2,1);
ERROR 1062 (23000): Duplicate entry '2-1' for key 'field1_2'

Вася, спасибо за подсказку smile.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#22 17.11.2012 04:51:33

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Большое спасибо всем ответившим. В общем и целом решил проблему через связку уникальных индексов. Но вышло сделать только с полями int и DATETIME. Не вышло с text. Поэтому буду благодарен за какую-либо информацию описывающую ограничение данной возможности.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#23 17.11.2012 05:12:31

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

Re: Проверить наличие записи в колонке

На колонку типа text нельзя сделать индекс, только на первые 1000 байт
index(`имя поля`(1000))

Неактивен

 

#24 17.11.2012 05:50:26

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Проверить наличие записи в колонке

Спасибо. Может есть еще какие-то ограничения?

Еще возникла необходимость удалить ряды, если в другой таблице нет рядов с таким id.

Те.

CREATE TABLE `table1` (`id1` INT(10) UNSIGNED NOT NULL,`text1` TEXT NULL);
CREATE TABLE `table2` (`id2` INT(10) UNSIGNED NOT NULL,`text2` TEXT NULL);


id1 = id2

если в table2 нет id2 равное id1 из table1.
То ряд с id1 из table1 надо удалить

Подскажите, какой-нибудь наиболее верный способ.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#25 17.11.2012 05:54:11

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

Re: Проверить наличие записи в колонке

Неактивен

 

Board footer

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