myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
6 страниц V  « < 2 3 4 5 6 >  
Ответить в данную темуНачать новую тему

> Вопросы Разработчикам Скриптов с SQL, вопросы по скриптам (мелкие вопросы)

Теги
Wariner
сообщение 22.3.2009, 0:47
Сообщение #61


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




т.е. получается есть таблицы

id....NIKC
1.....ник1
2.....ник2


id....IP
1.....ип1
2.....ип2

а третья будет вида
id.......id_NICK......id_IP
1.......id_ник1......id_ип1
2.......id_ник1......id_ип2

так?
Go to the top of the page
+Quote Post
Setuper
сообщение 22.3.2009, 0:55
Сообщение #62


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




возможно, что будет так:

id....NIKC
1.....ник1
2.....ник2


id....IP
1.....ип1
2.....ип2

а третья будет вида
id.......id_NICK......id_IP
1.......id_ник1......id_ип1
2.......id_ник1......id_ип2
3.......id_ник2......id_ип1
4.......id_ник2......id_ип2


при этом пара полей id_NICK и id_IP вместе являются уникальными
Go to the top of the page
+Quote Post
alex82
сообщение 22.3.2009, 3:28
Сообщение #63


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




А можно и вовсе одну таблицу создать. С первичным ключом по двум столбцам - IP и ник.
Go to the top of the page
+Quote Post
Setuper
сообщение 22.3.2009, 3:33
Сообщение #64


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Ну это смотря какие задачи)))

У меня в мульти-скрипте этого сделать невозможно)))

Простым программистам, в отличии от программистов баз данных, всегда хочется всё запихнуть в одну таблицу, при этом база данных становится не такой гибкой. Кроме этого, следует по возможности производить нормализацию базы данных и приведение её к нормальной форме Бойса-Кодда. Теория проектирования баз данных описывает алгоритмы правильного построения бд, другое дело, что не всегда получается им следовать, однако надо стараться это делать для того, чтобы получить наиболее эффективную базу данных, без избыточности и всяческий аномалий.
Go to the top of the page
+Quote Post
Wariner
сообщение 25.3.2009, 20:25
Сообщение #65


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Блин я как всегда туплю!
Код
    assert(con:execute[[
        CREATE TABLE IF NOT EXISTS `Nicks`(
        `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
        `Nick` VARCHAR(64) NOT NULL,
        PRIMARY KEY(`id`),
        UNIQUE(`Nick`)
    )
        CREATE TABLE IF NOT EXISTS `IPs`(
        `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
        `IP` VARCHAR(64) NOT NULL,
        PRIMARY KEY(`id`),
        UNIQUE(`IP`)
    )    
]])

ругается на синтаксис. чем разделить два запроса?
Go to the top of the page
+Quote Post
Setuper
сообщение 25.3.2009, 20:56
Сообщение #66


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Библиотека не предполагает выполнение двух запросов в одной транзакции. Для выполнения второго запроса должна быть закрыта первая транзакция.
Go to the top of the page
+Quote Post
Wariner
сообщение 25.3.2009, 21:59
Сообщение #67


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




блин да что ж такое. когда берусь за своего бота ничего не пашет(((
Код
function OnStartup()
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `Nicks`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`Nick` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`),    UNIQUE(`Nick`))]])
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `IPs`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`IP` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`),    UNIQUE(`IP`))]])
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `Users`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`id_Nick` MEDIUMINT(10) NOT NULL,`id_IP` MEDIUMINT(10) NOT NULL,PRIMARY KEY(`id`))]])

....

function UserConnected(tUser)
    local Share = Core.GetUserValue(tUser, 16) or 0
    con:execute(("INSERT INTO `Nicks (`Nick`) VALUES ('%s')"):format(tUser.sNick))
    con:execute(("INSERT INTO `IPs (`IP`) VALUES ('%s')"):format(tUser.sIP))

не добавляет в базу и всё тут!
Go to the top of the page
+Quote Post
Setuper
сообщение 25.3.2009, 22:02
Сообщение #68


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Невнимательность просто
con:execute(("INSERT INTO `Nicks` (`Nick`) VALUES ('%s')"):format(tUser.sNick))
Go to the top of the page
+Quote Post
Wariner
сообщение 26.3.2009, 17:26
Сообщение #69


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




есть код
Код
    con:execute(("INSERT INTO `Nicks` (`Nick`) VALUES ('%s')"):format(tUser.sNick))
    con:execute(("INSERT INTO `IPs` (`IP`) VALUES ('%s')"):format(tUser.sIP))
    con:execute(("INSERT INTO `Users` (`id_Nick`,`id_IP`) VALUES ((SELECT `id` FROM `Nicks` WHERE Nick = '%s'), (SELECT `id` FROM `IPs` WHERE IP = '%s'))"):format(tUser.sNick,tUser.sIP))

можно ли сделать проверку перед заносом данных в таблицу Users языком MySQL или это уже скриптом?
Go to the top of the page
+Quote Post
Setuper
сообщение 26.3.2009, 17:44
Сообщение #70


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




База данных должна быть организована таким образом, чтобы все лишние проверки исключались. То есть нужно соблюдать целостность базы данных. Целостность базы данных заключается в объявлении уникальных атрибутов. База данных сама проверяет уникальные атрибуты, и если вносятся данные с уже существующим в таблице уникальным атрибутом, то база игнорирует внесение в таблицу таких данных.

Уникальность атрибутов может осуществляться для каждого атрибута в отдельности, а может осуществляться для группы атрибутов.
В рассматриваемой тобой таблице `Users`, по всей видимости, уникальность нужно придать группе атрибутов: `id_Nick` и `id_IP`, тогда при очередной вставке в эту таблицу будет проверяться существование двух указанных значений.
Go to the top of the page
+Quote Post
Wariner
сообщение 26.3.2009, 21:34
Сообщение #71


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




с этим быстро разобрался. теперь есть:
Код
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `Nicks`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`Nick` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`),    UNIQUE(`Nick`))]])
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `IPs`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`IP` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`),    UNIQUE(`IP`))]])
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `Users`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`id_Nick` MEDIUMINT(10) NOT NULL,`id_IP` MEDIUMINT(10) NOT NULL,PRIMARY KEY(`id`),    UNIQUE(`id_Nick`,`id_IP`))]])
    assert(con:execute[[CREATE TABLE IF NOT EXISTS `MainLog`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`DateTime` DATETIME NOT NULL, `id_User` MEDIUMINT(10) NOT NULL,`Msg` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`))]])

и
Код
    if tCfg.MainLogs == 1 then
        local _,_,sData = string.find(sData, "%b<>%s+(.*)")
        con:execute(([[INSERT INTO `MainLog` (`DateTime`, `id_User`, `Msg`) VALUES ('%s', (SELECT `id` FROM `Users` WHERE
        (id_Nick = 'SELECT `id` FROM `Nicks` WHERE Nick = '%s'),(id_IP = 'SELECT `id` FROM `IPs` WHERE IP = '%s')), '%s')]]):format(os.date("%Y-%m-%d %H:%M:%S"),tUser.sNick, tUser.sIP, sData))
    end

в общем я хочу в таблицу лога главного чата записать ид юзера из таблицы Users. Получился громоздкий и неработающий код... Можно как то ужать?
Go to the top of the page
+Quote Post
alex82
сообщение 26.3.2009, 21:57
Сообщение #72


Местный
*******

Группа: Неактивированные
Сообщений: 908
Регистрация: 26.12.2008
Пользователь №: 1 574
Спасибо сказали: 1406 раз




Цитата
NOT NULL,PRIMARY KEY(`id`), UNIQUE(`IP`)

Т.е. и id и IP должны быть уникальными? Как-то не очень хорошо получается. А если зайдёт юзер с таким же IP?

И вообще, использовать id для лога чата бессмысленно до тех пор, пока незарегистрированные юзеры могут отправлять сообщения. id имеет смысл использовать там, где он может стать уникальным идентификатором чего-либо.
Go to the top of the page
+Quote Post
Wariner
сообщение 26.3.2009, 22:51
Сообщение #73


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




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

так как всё это делается при входе юзера то он 100% зареген! поэтому нужно id и именно из таблицы Users
Go to the top of the page
+Quote Post
Setuper
сообщение 26.3.2009, 23:18
Сообщение #74


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Всё верно, но вот только ты не совсем понял суть введения 3 таблиц, так как в твоём представленном варианте можно было вместо этих 3 таблиц записать 1 таблицу. Какой смысл несёт введение 3 таблиц у тебя? big_smile.gif Видимо ты просто повторил то, что я тебе сказал, но у меня всё по другому нежели у тебя, и смысл трёх таблиц заключается в идентификации аккаунта пользователя))))
Go to the top of the page
+Quote Post
Wariner
сообщение 26.3.2009, 23:52
Сообщение #75


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Цитата(Setuper @ 26.3.2009, 23:18) *
Какой смысл несёт введение 3 таблиц у тебя? big_smile.gif

снимает избыточность данных. я не знаю как это правильно выразить.... что я конкретно сделал не так?
Go to the top of the page
+Quote Post
Setuper
сообщение 27.3.2009, 0:02
Сообщение #76


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Ты прав, избыточность данных уничтожается. С точки зрения нормализации всё верно, однако с точки зрения здравого смысла избыточность такого рода заменилась избыточностью, выраженной в совпадении идентификаторов. По своей сути в этих трёх таблицах должны присутствовать ещё и другие поля, иначе смысл замены одной избыточности другой не понятен.
Если в таблицах Nicks и Ips присутствует по одному не ключевому атрибуту, то дробление на таблицы приводит к аномалиям в базе данных. В таблицах Nicks и Ips обязательно должны присутствовать 2 или более не ключевых атрибутов, тогда дробление оправдано.
Go to the top of the page
+Quote Post
Wariner
сообщение 27.3.2009, 17:46
Сообщение #77


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Как получить id последней строки таблицы?

на вот это ругается по синтаксису:
Код
local iNumb = assert(con:execute("LAST_INSERT_ID(`TextSeach`)"))
--или
local iNumb = assert(con:execute("mysql_insert_id(`TextSeach`)"))
Go to the top of the page
+Quote Post
Setuper
сообщение 27.3.2009, 19:39
Сообщение #78


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




А для чего тебе это понадобилось?

Код
SELECT `id` FROM `table` ORDER BY `id` DESC LIMIT 1
Go to the top of the page
+Quote Post
Wariner
сообщение 27.3.2009, 19:40
Сообщение #79


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




когда сделаю покажу. может ты подскажешь и другое решение)))
Go to the top of the page
+Quote Post
Wariner
сообщение 5.4.2009, 13:14
Сообщение #80


Самый главный активист :-D
***********

Группа: Модераторы
Сообщений: 2 790
Регистрация: 29.6.2008
Из: г. Тула
Пользователь №: 97
Спасибо сказали: 440 раз




Код
function SearchArrival(tUser, sData)
    sData = sData:sub(1,-2)
    local _,_,iNumber,sSeach = sData:find("$Search .-%s%u%p%u%p%d%p(%d+)%p(.*)")
    sSeach = String2Lower(sSeach)
    sSeach = sSeach:gsub("%p", " ")
    local _,_,sTthseach = sSeach:find("^(%a%a%a)")
    if sTthseach ~= "tth" then
        con:execute(("INSERT INTO `TextSeach` (`Seach`) VALUES ('%s')"):format(sSeach))
        con:execute(("UPDATE `TextSeach` SET '%s' = '%s' + 1 WHERE `Seach` = '%s'"):format("S"..tostring(iNumber), "S"..tostring(iNumber), sSeach))

где тут ошибка? инсертит но не апдейтит(((
создание таблицы:
Код
assert(con:execute[[CREATE TABLE IF NOT EXISTS `TextSeach`(`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,`Seach` VARCHAR(64) NOT NULL,PRIMARY KEY(`id`), `S1` MEDIUMINT(10) NOT NULL DEFAULT 0,
    `S2` MEDIUMINT(10) NOT NULL DEFAULT 0, `S3` MEDIUMINT(10) NOT NULL DEFAULT 0, `S4` MEDIUMINT(10) NOT NULL DEFAULT 0, `S5` MEDIUMINT(10) NOT NULL DEFAULT 0,
    `S6` MEDIUMINT(10) NOT NULL DEFAULT 0, `S7` MEDIUMINT(10) NOT NULL DEFAULT 0, `S8` MEDIUMINT(10) NOT NULL DEFAULT 0, `S10` MEDIUMINT(10) NOT NULL DEFAULT 0, UNIQUE(`Seach`))]])
Go to the top of the page
+Quote Post

6 страниц V  « < 2 3 4 5 6 >
Ответить в данную темуНачать новую тему
4 чел. читают эту тему (гостей: 4, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts ВАЖНО: Topic has attachmentsВопросы Разработчикам Скриптов
вопросы по скриптам (мелкие вопросы)
1 049 Wariner 991 361 3.2.2019, 12:51 Посл. сообщение: MIKHAIL
No new ВАЖНО: Topic has attachmentsМодули для скриптов RusHub
26 Setuper 45 394 21.3.2017, 17:31 Посл. сообщение: Alexey
No new ВАЖНО: Topic has attachmentsВаши Вопросы И Предложения По Поводу Форума
447 Svyat 322 163 20.10.2015, 19:39 Посл. сообщение: Ksan
No New Posts От: Вопросы Разработчикам Скриптов
От темы с ID: 173
0 MIKHAIL 4 337 23.1.2015, 0:56 Посл. сообщение: MIKHAIL
No new Topic has attachmentsВопросы по протоколу NMDC
Делаю программу
26 Master255 29 751 12.1.2015, 0:38 Посл. сообщение: Master255
No New Posts Вопросы к Phazeus по Экзекутору
Мастер может забанить мастера, как решить в Экзекуторе?
1 AndreiDC 5 373 31.10.2014, 19:20 Посл. сообщение: Ksan
No New Posts От: Установка скриптов
От темы с ID: 5657
0 MIKHAIL 4 800 29.7.2014, 23:37 Посл. сообщение: MIKHAIL
No New Posts Установка скриптов
Нужна помощь по установке
2 _wRz_ 7 309 29.7.2014, 16:11 Посл. сообщение: Артём
No new От: Вопросы Разработчикам Скриптов
От темы с ID: 173
29 Wariner 25 996 28.1.2014, 13:11 Посл. сообщение: Alexey
No new Topic has attachmentsВопросы по RusHub
Технические вопросы
316 Jaska 269 300 19.12.2013, 13:59 Посл. сообщение: mod
No new Topic has attachmentsМелкие вопросы
44 Wariner 50 989 19.9.2013, 12:34 Посл. сообщение: Alexey
No New Posts От: Ваши Вопросы И Предложения По Поводу Форума
От темы с ID: 753
3 anila 9 130 28.3.2013, 16:02 Посл. сообщение: настя
No New Posts Единая платформа для скриптов
Обсуждения вопроса создания единой платформы скриптов
5 Enyby 9 056 18.1.2012, 20:15 Посл. сообщение: Setuper
No new Topic has attachmentsПеределка скриптов
Прошу помощи
47 Fe(one)X 41 396 26.12.2011, 15:04 Посл. сообщение: Ksan
No New Posts От: Вопросы по RusHub
От темы с ID: 2902
4 Otshelnik-Fm 8 471 19.10.2011, 9:23 Посл. сообщение: Mangust

 



RSS Сейчас: 27.11.2024, 3:47