Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте, уважаемые форумчане. В колонке есть описание публикации. Нужно сделать ссылку на публикацию, если описание в нем есть, если описания нет, то делаю просто текст.
На мой взгляд делать запрос и вытаскивать все описание только ради того, чтобы проверить есть ли оно там или нет, не очень хорошо. Подскажите, так ли это и есть ли какой-нибудь способ получить лишь информацию о наличии записи в колонке навроде true false
Неактивен
where `имя колонки` = "" ?
Неактивен
запрос такой
select id, title, description from table where .....
записей доволно много получается, в поле description попадает очень много информации, оно самое большое.
Т.е. я получаю все записи и проверю уже они в поле description или нет.
На мой взгляд это не очень разумно, учитывая большое количество записей, поэтому подумал, что может существует способ получить только что-то навроде true false. При этом остальные записи мне нужны. те. скажем title есть всегда но если description не пустой, то я делаю ссылку на страницу, а если пустой то title Только текст
Отредактированно platedz (14.11.2012 02:17:08)
Неактивен
select id, title, if(description="",0,1) as `наличие/отсутствие описания` from table where .....
Неактивен
Спасибо, но так то непонятно а что здесь должно быть. `наличие/отсутствие описания`
Неактивен
Все понял. Спасибо огромное
Неактивен
Подскажите пожалуйста, а можно ли как то получить записи скажем где id='3' и title='тому, чему равен title Данного id'. Т.е. скажем у id='3' title='Новости', но title='Новости', есть также и у id 5,6,7. И нужно получить все записи у которых title равен тому, чему равен title того id в соответствии с которым идет запрос.
Неактивен
select .. from `table` where title = (select title from `table` where id=3);
Неактивен
Здорово. Спасибо большое. Подскажите еще, а можно ли как-то получить только часть записей в одном запросе. Т.е. скажем если из такого запроса
select id, title, description from table where .....
поле description нужно только в начале, те. если результат найдет и выдаст 10 полей, но вывести description мне нужно только из первого, а в остальных десяти мне нужны только id и title. Могу ли я как-то получить description только в первом по счете результате.
Отредактированно platedz (15.11.2012 06:07:05)
Неактивен
Нет, только двумя запросами.
Например, сначала выбрать id и title, а потом для первой пары получить description.
Неактивен
Ясно. Еще раз спасибо.
Неактивен
Подскажите, пожалуйста, а можно ли как-то проверить дублирующиеся поля.
Т.е. скажем есть поле
time - в которое записывается время события
и sob - в которое записывается название/описание события
Есть вероятность, что одно событие может записаться больше одного раза. При этом в одно и тоже время могут произойти разные события и одно событие может происходить в разное время, но не может происходить одно и тоже событие в одно и то же время.
Можно ли как-то проверить что есть несколько рядом в котором все поля одинаковые, для того, чтобы удалить клоны
Отредактированно platedz (16.11.2012 22:51:58)
Неактивен
Проще всего в таких случаях создать уникальный ключ на связку (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
Неактивен
Большое спасибо за ответ.
Если запрос вернет ошибку, то остальные запросы я так понимаю уже обрабатываться не будут, а нужно чтобы игнорировал. Или как?
Кроме прочего, в базе уже есть дублирующиеся поля, только как-то не ясно, как же удалить клоны. Как сделать delete ... или что-то подобное?
Неактивен
Если запрос вернет ошибку, то остальные запросы я так понимаю уже обрабатываться не будут, а нужно чтобы игнорировал. Или как?
Это от Вашего кода зависит - если в транзакцию все запросы обернуть, то она откатится после первого же запроса, который вернет ошибку. Если же Вы просто последовательно выполняете запросы, при этом не задавая дополнительных условий, чтобы выполнение прервалось в случае ошибки - ну так тогда будет попытка выполнить все запросы...
И посмотрите здесь.
Неактивен
Спасибо. С уникальным ключом на связку я еще попробую разобраться.
Но вот как проще решить проблему удаления уже существующих дубликатов, я так и не понял. Описанный по ссылке способ наверно не совсем то, т.к. в обоих полях однозначно есть не мало одинаковых записей, но они должны не совпадать со временем. На данный момент единственным решением мне приходит в голову это получив все записи с группировки, уже удалить их в цикле в зависимости от количества, но может есть какой-то другой способ? Все-таки что-нибудь навроде delete ....
Отредактированно platedz (17.11.2012 00:39:21)
Неактивен
Почему способ по ссылке "не совесм то"?
Это кстати, самый простой способ. Через delete будет сложнее.
Неактивен
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 на нее ругается - ибо не может удалить из той таблицы, откуда сейчас выбираем. Если я ничего не путаю - напомни своё решение пожалуйста, там точно в один запрос было.
Неактивен
Извращения практически нет. Подзапрос материализуем во временную таблицу, а дальше стандартный множественный delete
http://dev.mysql.com/doc/refman/5.5/en/delete.html
Для твоего примера, если мы хотим оставить поля с максимальным id в группе (группировка по field1,field2), то
Неактивен
Способ с созданием дополнительной таблицы описанный здесь http://sqlinfo.ru/forum/viewtopic.php?id=3737 мне честно говоря кажется не самым лучшим.
В остальном
Если я правильно понимаю, то при создании таблицы со связкой это выглядет так
Отредактированно platedz (17.11.2012 04:19:25)
Неактивен
Ок, создаём таблицу, заполняем данными (причем пара (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)
Пробуем "уникализировать" (если так можно сказать пару (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'
Вася, спасибо за подсказку .
Неактивен
Большое спасибо всем ответившим. В общем и целом решил проблему через связку уникальных индексов. Но вышло сделать только с полями int и DATETIME. Не вышло с text. Поэтому буду благодарен за какую-либо информацию описывающую ограничение данной возможности.
Неактивен
На колонку типа text нельзя сделать индекс, только на первые 1000 байт
index(`имя поля`(1000))
Неактивен
Спасибо. Может есть еще какие-то ограничения?
Еще возникла необходимость удалить ряды, если в другой таблице нет рядов с таким id.
Те.
Неактивен
Неактивен