PDA

Просмотр полной версии : sql запрос


lovepsone
25.01.2011, 18:14
вот у меня 2 таблицы t1 и t2! они одинаковые по структуре но в t1 больше значений, а в t2 меньше! как задать запрос на эти таблицы что б из t1 показывала одинаковые значения t2 и удаляла одинаковые значения из t1, что бы потом я мог соединить эти таблицы в одну t2?

Sid
25.01.2011, 18:28
DELETE FROM `t1` WHERE `t1`.`f1` IN (SELECT `f1` FROM `t2`);

А проще

INSERT IGNORE INTO `t1` SELECT * FROM `t2`;

Както так.

YuruY
25.01.2011, 18:47
Если в таблицах ключи по всем полям (либо ключей вообще нет), то скорее получите сумму двух таблиц.

lovepsone
25.01.2011, 19:06
Добавлено через 5 минут
DELETE FROM `t1` WHERE `t1`.`f1` IN (SELECT `f1` FROM `t2`);

не понял я немного выделенное выражение

Если в таблицах ключи по всем полям, то скорее получите сумму двух таблиц.
нет ключи не стоят! смысал в том что t1 таблица устарела но есть инфа которая еще актуальна! получается то что в колонке id значения одинаковые, а вот в остальных колонках разные! просто значений 3000 и в ручную не охота исправлять!

YuruY
26.01.2011, 05:36
Добавлено через 5 минут

не понял я немного выделенное выражение


А так понятней?
select * from t1 where ID not in (select (ID) from t2);

virusav
26.01.2011, 08:33
В любом случае надо расставить ключи и добавить им уникальность.
В этом случае можно использовать INSERT IGNORE INTO.

Для удаления ключи не обязательны, но для более быстрой выборки желательны:
DELETE `t1` FROM `t1`, `t2` WHERE `t1`.`f1`=`t2`.`f1`;

lovepsone
27.06.2011, 06:16
Вот у меня созрел еще вопрос.
Вот с сайта я хочу отправить sql запрос типа:
Персонажу с определенным GUID'ам приходило письмо, в котором лежит вещь (тоже с определенным id'ам )
sql запрос начал писать на таблицу 'mail'. Дошел до колонки mailTemplateId и начал париться. На сколько я понял значения mailTemplateId берутся из mail_loot_template, и тут я застрял. Может кто чем поможет?

Хех.... я забыл что такая вещь существует как WIKI!



ХМ..... почитав вики, я в непонятках. Это ж сколько запросов на базу делать надо то? Может есть вариант по проще?

Sid
27.06.2011, 08:06
External Mail patch

lovepsone
27.06.2011, 08:23
если есть то можно на него глянуть то хоть??? погуглю.
Патч то я нашел! Может у кого-то есть по свежее патчик чем сдесь https://github.com/xeross/mangos.git?
Хотя нет лучше я сам! Спасибо за подсказку!

Кот ДаWINчи
27.06.2011, 09:46
Вот с сайта я хочу отправить sql запрос типа:
Персонажу с определенным GUID'ам приходило письмо, в котором лежит вещь (тоже с определенным id'ам )

а что хочется получить в результате этого запроса?

(а то лопату выдал, направление показал, но как рыть не понятно... ;) )

KiriX
27.06.2011, 09:54
Тоже думал о почте через сайт.
Самое сложное для меня оказалось сделать так чтобы, гуиды письма и итема в письме совпадали. Проблему не решал, но если это решить - проблем с отправкой вещей по почте через сайт быть не должно и без всяких патчей.
Кот, надо чтобы при отправке id для таблицы mail и mail_id для таблицы mail_item сразу были одинаковы.

Кот ДаWINчи
27.06.2011, 13:19
Тоже думал о почте через сайт.

Таким образом почту с сайта не отправить. Аргументирую: Сервер во время своей работы не проверяет изменения в некоторых таблицах своих баз, сделанные "из вне". Это уже мной проверлось. И почта как раз входит в их число. (Проверял еще на 3.0.9, но с того времени, вроде бы, ничего не изменилось) Письмо "придет" адресату только после перезапуска сервера. Лучше для этого пользоваться SOAP или RA.

а здесь можно предложить только просматривать свои письма через сайт. (кстати, хорошая мысль для АСР рев.29 ;) )

KiriX
27.06.2011, 13:31
Ну что только после перезапуска и лучше вообще SOAP - это понятно. Всё равно хотелось бы понять как можно сделать именно так =)

Vladimir
27.06.2011, 15:15
если система почты не будет перечитывать таблицы то "так" без предварительной остановки сервера будет кораптить item_instance

KiriX
27.06.2011, 16:36
Почему? На каком основании?

rsa
27.06.2011, 19:50
на сновании пересечения гуидов как минимум. очень многие игровые объекты создаются только в памяти сервера при его старте а также в процессе игры, и в базу только выгружаются, но вовсе с ней не синхронизируются.

lovepsone
28.06.2011, 00:00
То есть без патча реализовать не реально? Даже если и получится сразу отправить столько запросов то сообщение придет только после перезапуска серва???? Ну что ж, будем думать.
Да и еще вопрос:
Можно ли как-то ВОССТАНОВИТЬ персонажа, после того как его удалили???(на своем аке удалил нечаянно перса,а как восстановить песра не знаю)

KiriX
28.06.2011, 00:13
Char.log?
rsa, ага, уловил. Точно, недавно ведь сталкивался с этим сам, когда кой-чего в базе замутить хотел =)

Кот ДаWINчи
28.06.2011, 06:24
если система почты не будет перечитывать таблицы то "так" без предварительной остановки сервера будет кораптить item_instance
Это-то понятно, но я пытался сказать немного не об этом. например при UPDATE некоторых полей сервер будет показывать старое значение, а если персонаж был в это время в игре, то после следующего его сохранения (.save) или по выходу, все ваше "сайтовые" изменения могут быть перезаписаны старыми значениями. По крайней мере, с тикитами это происходит (происходило) именно так, с почтой вроде тоже. Хотя, я могу глубоко заблуждаться. :(


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

То есть без патча реализовать не реально?
РЕАЛИЗОВАТЬ! Через SOAP или RA.

Можно ли как-то ВОССТАНОВИТЬ персонажа, после того как его удалили???(на своем аке удалил нечаянно перса,а как восстановить песра не знаю)
Можно, но это зависит от настроек в mangos.conf ! В конфиге можно включить логирование SQL-дампа при удалении. или сменить способ удаления:

http://wiki.ytdb.ru/index.php/Mangosd.conf


# CharLogDump
# Перед удаление персонажа сбросить сведения о нем в файл лога
# Для восстановления персонажа удалите строки:
# line == START DUMP == to line == END DUMP == и восстановите чара, использую команду logdump
# Стандартно: 0 - не сбрасывать информацию при удалении
# 1 - сбрасывать информацию при удалении
#



# CharDelete.Method
# Метод удаления персонажа
# Стандартно: 0 - Полностью удаляет персонажа из базы данных
# 1 - Убирается привязка персонажей к аккаунтам,
# их имена освобождаются и в игре выглядят как удаленные
#
# CharDelete.KeepDays
# Сколько дней хранить записи об удаленных персонажах перед удалением записей из базы.
# Стандартно: 30
# 0 - Не удалять записи о персонажах и хранить их всегда.
#


и вообще, у хорошего админа должен происходить ежесуточный бакап баз realmd и characters. :)

lovepsone
28.06.2011, 14:06
Спасибо за подсказку. Ну что ж погнал я тогда реализовывать!

Vladimir
28.06.2011, 14:33
все равно непонятно почему не воспользоваться существующими командами консоли + SOAP

lovepsone
28.06.2011, 17:18
я так и собираюсь сделать.
Вот и еще вопрос:
А разве через косоль можно отправить почту с определенным предметом ? Или проще воспользоваться командой additem namechar iditem???? (просто консолью пользовался давным давно и не знаю какие команды существуют в консоли, а те что консоль показывает мне не подходят)

KiriX
28.06.2011, 20:05
.send items

lovepsone
06.07.2011, 12:09
Надеюсь на вашу помощь:
$command = 'send items lovepsone "test mail" "test item" 50731';

если вместо 50731 (ид предмета) прописать переменную, типа вот так

$command = 'send items lovepsone "test mail" "test item" $iditem';
то мне выдает ошибку типа не правильный синтаксис в гм команде. а если подставляю ид предмета то все норм.
И еще вопрос!
У меня кодировка стоит cp1251, я так понимаю что если имя игрока на Русском языке, то консоль попросит кодировку utf-8, или проблем не будет когда имя в переменной? (данную проблему не знаю как решить, так как если переменную подставить то пишет что не правильный синтаксис в гм команде)

Vipertv
06.07.2011, 12:20
Попробуйте так:

$command = 'send items lovepsone "test mail" "test item" '.$iditem;

Php в одинарных кавычках не заменяет переменную на значение.

lovepsone
06.07.2011, 12:48
спасибо! Я даже и не знал что в одинарных кавычках не заменяется переменная на значение

KiriX
06.07.2011, 15:10
спасибо! Я даже и не знал что в одинарных кавычках не заменяется переменная на значение
http://www.en.kolobok.us/smiles/artists/cherna/Cherna-facepalm.gif

lovepsone
06.07.2011, 16:12
http://www.en.kolobok.us/smiles/artists/cherna/Cherna-facepalm.gif

Я просто кавычкам не придавал значения как, почему, зачем. Когда начал изучать пхп, раздел синтаксиса пропустил, зря конечно.

KiriX
06.07.2011, 23:08
Я просто кавычкам не придавал значения как, почему, зачем. Когда начал изучать пхп, раздел синтаксиса пропустил, зря конечно.
Действительно зря... Пусть ты уже и явно не ноль в пхп, но я настоятельно рекомендую почитать какой-нить ман для начинающих с самых-самых основ. Сам удивишься, сколько всего ты ещё не знаешь ;)

Shadez
07.07.2011, 06:16
К вопросу о SOAP - создание/удаление и прочие операции с лотами на аукционе его средствами возможно?

Minimajack
07.07.2011, 08:38
ChatHandler::HandleAuctionItemCommand - можно переделать.

ZzZzZzZ
07.07.2011, 12:58
А есть примеры как с SOAP работать?

Sid
07.07.2011, 13:03
Я на Qt сделал простенький ремут админ, конектит по RA или SOAP :)

lovepsone
07.07.2011, 18:38
Действительно зря... Пусть ты уже и явно не ноль в пхп, но я настоятельно рекомендую почитать какой-нить ман для начинающих с самых-самых основ. Сам удивишься, сколько всего ты ещё не знаешь ;)

Последую вашему совету....

lovepsone
06.10.2011, 14:48
Подскажите добрые люди запрос на базу mysql!
К примеру у меня имеется массив a=array(1..10); и b=array(5..15)
в базе содержится 15 строк и одна колонка с название id (в ней содержаться значения от 1 до 15 в соответствующей номеру строки )!

Нужен такой запрос к примеру:
если a<>b то удалить строку колонки id равную значению b,
то есть если b=11 то надо удалить id=11 (11 строку) так как a=11 - не существует,
или если a=3 то надо удалить id=3 (3 строку) так как b=3 - не существует.

Да и еще значения параметра a могут быть к примеру от 1 до 3 и от 7 до 10,
а значения параметра b могут быть к примеру от 3 до 5 и от 9 до 13

Minimajack
06.10.2011, 16:20
lovepsone
дайте лучше нормальное описание...то что написано - смахивает на бред
"у меня имеется массив" - где имеется?
DELETE FROM table where id=?

lovepsone
06.10.2011, 16:59
массив переменной а и b и вобщем то мне нужно исключить числа которые находятся в базе! к примеру массив a содержит числа от 1 до 15, и массив b содержит числа от 10 до 20! общие у них числа от 10 до 15 !
в базе есть значения допустим от 1 до 30! а мне нужно что-бы скрипт удалял значения в базе от 1 до 10 и от 15 до 30! то есть что бы в базе содержались общее значение массивов a и b (как я писал выше у них общие значения от 10 до 15)
если не понятно:
вот хочу составить запрос типа
(к примеру таблица users в ней 2 колонки id, online )
DELETE FROM `users` WHERE id`='a<>b'
a<>b - a не ровно b
как такой запрос написать ?

Кот ДаWINчи
06.10.2011, 17:57
а где хранятся a и b? ;)

lovepsone
06.10.2011, 19:26
я просто не знаю как еще вам объяснить какого эффекта я хочу добиться ! я вроде ясно написал что к примеру массив a содержит числа от 1 до 15,
к примеру
a[1]=1;
a[2]=2;
...
a[n]=n;
где n числа от 1 до 15!

Кот ДаWINчи
06.10.2011, 21:03
т.е. речь идет о массиве скрипта ПХП... Тогда при чем тут запрос в базу Mysql?

Тебе надо писать полноценный скрипт с запросом(запрсами) в базу.

Вот тебя никто понять и не может.

NarkoHeal
06.10.2011, 23:33
Я так понял нужно удалить строки в которых id меньше чем число 'a' но больше чем 'b' ведь так я понял?
delete from users WHERE id<'a' and id>'b';

Minimajack
07.10.2011, 00:12
Я так понял нужно удалить строки в которых id меньше чем число 'a' но больше чем 'b' ведь так я понял?
delete from users WHERE id<'a' and id>'b';

нее а и б это массивы
для пхп используем array_intersect (http://php.net/manual/en/function.array-intersect.php)
$result = implode(",", array_intersect($a,$b));
и запрос DELETE FROM TABLE WHERE id NOT IN ($result)
только сначала проверь на SELECT * FROM TABLE WHERE id NOT IN ($result)

lovepsone
21.10.2011, 16:39
Вот еще вопрос! Пишу форум и наткнулся на одну проблему которую решить не могу.
Структура одной таблицы
CREATE TABLE `wcf_forums_threads` (
`forum_id` int(11) default NULL,
`thread_id` int(11) unsigned NOT NULL auto_increment,
`user_id` int(11) default NULL,
`thread_name` longtext,
`thread_postcount` smallint(5) unsigned NOT NULL default '0',
PRIMARY KEY (`thread_id`),
KEY `thread_postcount` (`thread_postcount`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

структура другой таблицы
CREATE TABLE `wcf_forums_posts` (
`forum_id` int(11) default NULL,
`thread_id` int(11) default NULL,
`posts_id` int(11) unsigned NOT NULL auto_increment,
`user_id` int(11) default NULL,
`posts_text` longtext,
PRIMARY KEY (`posts_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


Я выполняю запрос
$add_thread = mysql_query("INSERT INTO `wcf_forums_threads`
(`forum_id`,`user_id`,`thread_name`,`thread_postco unt`)
VALUES
('$forum_id','".$_SESSION['user_id']."','".$_POST['name_thread']."','1')");

Затем я выполняю запрос
$add_post = mysql_query("INSERT INTO `wcf_forums_posts`
(`forum_id`,`thread_id`,`user_id`,`posts_text`)
VALUES
('$forum_id','Вот здесь должен быть ид с прошлого запроса!Как мне его определить не вызывая команду Select?','".$_SESSION['user_id']."','".$_POST['thread']."')");

Или может как то под запрос написать ?

Minimajack
21.10.2011, 16:44
http://php.net/manual/ru/function.mysql-insert-id.php

lovepsone
21.10.2011, 16:58
http://php.net/manual/ru/function.mysql-insert-id.php

Спасибо буду знать что это функция mysql_insert_id();

lovepsone
28.10.2011, 14:41
вот еще такой вопрос!
Тут на форуме реализована такая фишка
допустим в разделе коммиты мангоса [11623] Implement... (http://ru-mangos.ru/showthread.php?p=25187#post25187)
То есть я хочу сделать запрос на базу который будет извлекать не все символы а только часть. У меня получилось вот что:
SELECT SUBSTRING(thread_subject,0,5) FROM `forums_threads` WHERE `thread_lastpostid`='".$section['forum_lastpostid']."' LIMIT 1
сам запрос 100% проходит, так как он мне показывает другие данные правильно, но вот название самой темы нет, то есть не показывает значения колонки thread_subject!
Использую такой скрипт

$query_lastpost = mysql_query("SELECT SUBSTRING(thread_subject,0,5) FROM `forums_threads` WHERE `thread_lastpostid`='".$section['forum_lastpostid']."' LIMIT 1") or trigger_error(mysql_error());
$lastpost = mysql_fetch_assoc($query_lastpost);

echo"<td width='21%' class='page'>&nbsp;&nbsp;".$lastpost['thread_subject']."</td>";

структура таблицы
CREATE TABLE `forums_threads` (
`forum_id` int(11) default NULL,
`thread_id` int(11) unsigned NOT NULL auto_increment,
`thread_subject` longtext,
`thread_author` int(11) default NULL,
`thread_views` int(11) default NULL,
`thread_lastpostid` int(11) unsigned NOT NULL default '0',
`thread_lastuser` int(11) unsigned NOT NULL default '0',
`thread_postcount` int(11) unsigned NOT NULL default '0',
PRIMARY KEY (`thread_id`),
KEY `thread_postcount` (`thread_postcount`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

В чем проблема?Я думаю что нужна функция mysq или php. Если так то подскажите.

Альтернативный вариант работает на php
substr(текст,с какого символа начинать,каким символом закончить)
но все же как обойтись запросам?

Minimajack
28.10.2011, 16:27
$query_lastpost = mysql_query("SELECT SUBSTRING(thread_subject,0,5) AS thread_subject FROM `forums_threads` WHERE `thread_lastpostid`='".$section['forum_lastpostid']."' LIMIT 1") or trigger_error(mysql_error());

lovepsone
31.01.2012, 17:17
Буду очень благодарен если вы мне все объясните!
Есть вот такой запрос
$resul = mysql_query('SELECT `colum1` FROM `table` WHERE `colum2`= ?d', $a);

Объясните что тут делают символы ?d и к чему тут переменная $a

Lordronn
31.01.2012, 17:25
это форматирование строки

ghostpast
31.01.2012, 17:28
Буду очень благодарен если вы мне все объясните!
Есть вот такой запрос
$resul = mysql_query('SELECT `colum1` FROM `table` WHERE `colum2`= ?d', $a);

Объясните что тут делают символы ?d и к чему тут переменная $a
значение переменной $a подставляется в параметр ?d

lovepsone
31.01.2012, 18:29
значение переменной $a подставляется в параметр ?d
Большое спасибо!

Evgeniy
31.01.2012, 22:28
значение переменной $a подставляется в параметр ?d
не полностью. Значение подставляется и интерпретируется как целое число.
если дбсимпл конечно =)))

Кот ДаWINчи
01.02.2012, 04:15
не полностью. Значение подставляется и интерпретируется как целое число.
если дбсимпл конечно =)))

и где вы увидели дбсимпл? я вижу стандартную функцию пхп - mysql_query() :secret:

Evgeniy
01.02.2012, 09:24
и где вы увидели дбсимпл? я вижу стандартную функцию пхп - mysql_query() :secret:
ну название ни о чем не говорит...проверьте по параметрам. Явно что обертка над чем то...
так коректней: как и дбсимпл возможно использует ?d - для подстановки целого числа.

lovepsone
01.02.2012, 10:05
и где вы увидели дбсимпл? я вижу стандартную функцию пхп - mysql_query() :secret:

Вы правы тут php + mysql!

Evgeniy
01.02.2012, 14:37
Вы правы тут php + mysql!
Зачем кричать? ООП - и уже не пхп?
Вот описание стандартной функции:
resource mysql_query ( string $query [, resource $link_identifier ] )
если фукцию mysql_query не переопределить - приведенный код не адекватный( значение ?d - воспринимается как строка, $a - ресурс БД).

KiriX
01.02.2012, 15:39
А между тем Evgeniy прав... ;)