|
|
|
| Есть таблица в которой есть колонка ailas, например в одной из строк есть знаячение name.
Как сделать так, что при добавлении новой строки дублирующего значения name колонки alias создавалось новое значение name_1,
при очередном дублировании name содавалось name_2 и т.д. | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 15:13)
| | Добавление каким способом - приходит от клиента и помещается в базу?
Значит при выводе таблице нумеруйте.
Добавляется динамически на стороне клиента?
Значит в раздел html - это js работа. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 15:35)
| | причем здесь html и js?
данные из формы добавляютя в БД, необходимо, чтоб в БД они были уже уникальны | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 15:41)
| | А при том, что вы же не поясняете, что значит "добавить", вот и уточняем.
А добавленная запись в базу имеет свой уникальный id? Если да, то почему его нельзя использовать? | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 15:41)
| | > причем здесь html и js?
А вы что, где-то написали о какой технологии идет речь? Явно не о пхп. В пхп нет таблиц. Значит имеется ввиду либо хтмл-таблица, либо таблица БД. В любом случае это не из этого раздела вопрос.
Так что вам нужно? Можно сделать и на уровне БД не возвращаясь в ПХП.
И что такое "name"? Это именно всегда name или это любая строка может быть? | |
|
|
|
|
|
|
|
для: Sfinks
(28.05.2012 в 16:02)
| | name это всего лишь пример, значение может быть любое,
т.е. если name существует, создавалось значение name_1 если и оно существует создавалось name_2 и т.д. | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 16:14)
| | Вы бы лучше словами пояснили подробнее чего вы делаете, глядишь и решение нашлось у кого либо хорошее.
Что значит name - это запись в базе, причем имеющая уже уникальное значение, или же это значение из какой-то записи, при этом в этой записи может быть несколько значений с таким именем?
Что значит уникальность в данном случае - она используется впоследствии и должна быть постоянной, или речь идет о временной нумерации на странице, которая может меняться? | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 16:19)
| | значение поступает из формы и заносится в базу данных
дублей name в таблице не должно быть, т.к. оно формирует ссылку на конкретный материал и по значению alias будет загружаться нужный материал | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 16:32)
| | Я вас о структуре ваших данных спрашиваю, а вы о том откуда приходит. Да пусть хоть почтой присылают.
Можно держать имя "name" в таблице под id=12, и такое же имя, но под id=13. И это две разных ссылки будут, причем не по "name", а по id.
Думаю вы знакомы с таким, а значит должны понять о чем спрашивают вас. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 16:37)
| | например есть поле name в которые записываются названия новостей на кириллице,
а alias это их дубли в транслите,
вот чтоб избежать дублей именно в alias, т.е. в одной строке одно значение | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 16:47)
| | А на кириллице значит не важно, сколь угодно одинаково?
Я могу это представлять так:
id cyr trs
1 так tak
14 так tak
|
и первичное поле у вас уже обеспечивает уникальность, для обеих полей. А если дубль транслита, то это значит одинакова и кириллица. И чего вы хотите не понятно. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 16:58)
| | я же написал, что я хочу
id cyr trs
1 так tak
14 так tak_1
26 так tak_2
|
чтоб в адресной строке было так:
/news/tak /
/news/tak_1 /
/news/tak _2/
а не так
/news/1 /
/news/14 /
/news/26/ | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 17:01)
| | А не лучше ли по id? Или /news/tak _2/ это красота неописуемая, а /news/26/ это фуфло? Не проще ли извлекать записи из базы по уникальному id, чем карячится по транслиту?
А если так хочется, то ранее я говорил - что вам мешает добавлять к транслиту первичный ключ при добавлении записи в базу? | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 17:09)
| | а почему корячиться, разве это не решаемая проблема?
вы предлагаете так:
/news/1/tak /
/news/14/tak/
/news/26/tak/ | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 17:11)
| | Да проблема то решаема, но вы тут о миллионах говорили, а работать с числами проще и быстрее, нежели со строками.
Впрочем, если вам все равно, дело хозяйское.
Я говорил так - если при добавлении записи она получает id 15, то обновление поля транслита и получается tak _15, значит /news/tak _15/. Вы же такого желаете.
Кстати, можно предположить, что это под mod_rewrite, то ваш транслит в url, это тоже не лучшее для него. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 17:15)
| | не совсем так я не хочу привязывать id к транслиту, я хочу, что при дублировании значение увеличивалось на единицу tak, tak_1,tak_2 ... а если нет дублей, то без цифр просто tak
о каких миллионах вы говорите? | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 17:22)
| | Не маялись бы вы ерундой, а делали бы так, как проще и быстрее, тем более, что ваш транслит не так и читабелен, чтобы кто-то там интересовался им в ссылке.
Ну а если вам нужна еще и нумерация - проверяйте есть ли такое и нумеруйте, по другому никак. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 17:35)
| | ну вот ч чего начали к тому и вернулись, вопрос был изначально поставлен, как проверить, есть ли такое? | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 17:38)
| | Вы же должны как-то вычислить номер уже существующий, значит надо делать запрос, а ведь у вас не номер, а строка. Иначе было бы просто, типа такого:
<?
"INSERT INTO `tbl` (`name`, `trans`) VALUES ('val','val')
ON DUPLICATE KEY UPDATE `trans` = CONCAT(VALUES(`trans`),'_1')"
|
Может лучше нумерацию держать в отдельном поле, так проще будет и для поиска, и принятия решения. А уж "приклеить" этот номер можно и при выводе. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 17:49)
| | я об этом думал, т.е. отделить нумерацию в отдельное поле | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 18:23)
| | Ну да. Можно конечно "прошерстить" и строки ваши, но с помощью рег.выражения, но ведь это утяжеление выполнения запроса, и пусть вставка данных реже чем вывод, все равно стоит ли?
А если в отдельном поле, то достаточно запросить число записей (значения то без номеров одинаковы), и N-1, даст вам следующий номер.
PS. Только учтите, что это не уникальность, то есть, если запись N удалена, то такая "уникальность" нарушается, ибо добавление нового примет удаленный номер. И если кто-то сохранил ссылку на "старое", то попадет уже совсем не туда. | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 18:26)
| | Однако вы тут настрочить успели, пока я запрос составлял.... ))) | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 16:14)
| | Нужно, конечно, послушать confirm'a и пересмотреть структуру БД....
Но мне охото было поупражняться в SQL =)))
<?php
// пусть таблица имеет имя tbl
// поле, которое нас интересует называется f1
// также в таблице есть еще 2 текстовых поля f2 и f3
// и одно целочисленное f4
// значения, которые нужно вставить
$val_1 = 'name'; // для столбца f1
$val_2 = 'fgh'; // для столбца f2
$val_3 = 'jkl'; // для столбца f3
$val_4 = 123; // для столбца f4
// в запросе нужно исправить имена таблицы (tbl) и полей (f1,f2,f3,f4) на реальные
$sql = "INSERT INTO tbl(f1,f2,f3,f4)
SELECT CASE WHEN T3.f1 IS NULL THEN nm
WHEN T2.f1 IS NULL THEN CONCAT(nm,'_1')
ELSE CONCAT(nm,'_',max(CAST(substr(T2.f1,length(nm)+2) AS UNSIGNED))+1)
END f1
,'$val_2' f2
,'$val_3' f3
, $val_4 f4
FROM (SELECT '$val_1' nm)T1
LEFT JOIN tbl T2 ON T2.f1 LIKE CONCAT(nm,'\_%')
LEFT JOIN tbl T3 ON T3.f1 = nm";
mysql_query($sql);
?>
|
| |
|
|
|
|
|
|
|
для: Sfinks
(28.05.2012 в 18:46)
| | Да, для упражнения конечно мощно, но стоит ли все этого? )) | |
|
|
|
|
|
|
|
для: confirm
(28.05.2012 в 18:49)
| | А я начал с того что не стОит ) | |
|
|
|
|
|
|
|
для: Sfinks
(28.05.2012 в 18:46)
| | Есть подозрение, что
<?php
$sql = "select count(*) from `tbl` where `cyr`='$cyr'";
list($count) = mysql_fetch_row(mysql_query($sql));
settype('count', 'int');
$trs = $count ? 'name_'. (++$count) : 'name' ;
mysql_query("insert into `tbl` set `cyr`='$cyr', `trs`='$trs'");
|
сработает быстрее, чем это sql-великолепие)
Но упражнение зачетное.
ps.И, в любом случае, индекс бы не помешал на строке в таблице при такой организации структуры. | |
|
|
|
|
|
|
|
для: The Electronic Cat
(29.05.2012 в 14:07)
| | Если бы я начиная писать запрос знал о существовании поля cyr и откуда там ноги растут, то и запрос составил бы на основе его значения.
Т.е. то что вы написали, только на уровне SQL. И это было бы быстрее.
Но ТС же не сказал сразу ничего. Как и из всех пришлось клещами вытягивать. | |
|
|
|
|
|
|
|
для: The Electronic Cat
(29.05.2012 в 14:07)
| | Хотя, если предположить, что в таблице были name_1, name_2, name_3, name_4, а потом name_3 удалили, то ваш вариант уже сработает не правильно и добавит nаme_4 второй раз. | |
|
|
|
|
|
|
|
для: Sfinks
(29.05.2012 в 15:22)
| | МАХ поможет. )
Но предположение об удалении, это как раз то, что и определяет бесполезность этой затеи в том виде, в котором хочет автор ее.
На уникальность (в кавычках) я говорил автору, вроде бы как побоку это. Если даже и будет принято мое замечание во внимание, и в конечном итоге будет так:
url/id/yazyk_mozhno_slomat_ot_takogo_kotoroe_nafik_komu_nuzhno_120
то это все равно не решает проблемы такой "уникальности", значит надо добавлять еще бухгалтера ведущего отчет прихода/расхода.
Вот и возникает вопрос - это для чего, если практическая ценность от этого нулевая и информативная составляющая тоже близка к нулю? Остается только и вспоминать о верности высказывания - "охота пуще неволи". | |
|
|
|
|
|
|
|
для: Bvz
(28.05.2012 в 15:13)
| | Проверяйте совпадения в поле ailas и все, до тех пор пока идет совпадение имени с уже существующим именем в базе, увеличивайте его индекс name_<номер> | |
|
|
|
|
|
|
|
для: ONYX
(28.05.2012 в 15:55)
| | Добавлю, что если совпадений будет миллион, можете сходить попить чаю =)))) Как раз успеете. | |
|
|
|
|
|
|
|
для: Sfinks
(28.05.2012 в 16:03)
| | Не в ту ветку | |
|
|
|