Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   Sql запросы (http://mangos.ytdb.ru/showthread.php?t=262)

FreeBSD 12.03.2010 14:23

Sql запросы
 
Делимся sql запросами.

Пак запросов от LLIbIcpEP на чистку базы:




Запрос аккаунты на которых нет персонажей:


Запрос удаляет вещь у всех персонажей(В место entry ставим ид пердмета):



Запрос удаляет вещь у всех торговцев, запрос по id (entry) вещи:




P.s Выкладываем свои запросы в базу которыми вы пользуетесь.

Konctantin 12.03.2010 14:32

поправьте ошибку:
('entry'');

'id_вещи';

Desperado 12.03.2010 14:33

Выводит людей, сделавших определённый квест

PHP код:

SELECT 
    cc
.namecc.levela.username 
FROM 
    characters
.`character_queststatuscq 
INNER JOIN 
    characters
.characters cc 
ON 
    cc
.guid cq.guid 
INNER JOIN 
    realmd
.account a 
ON 
    a
.id cc.account 
WHERE 
    quest 
xxx

Когда выполняли квест

PHP код:

SELECT 
    cc
.namecc.levela.usernamefrom_unixtime(cq.time)
FROM 
    characters
.`character_queststatus_dailycq
INNER JOIN 
    characters
.characters cc ON cc.guid cq.guid
INNER JOIN 
    realmd
.account a ON a.id cc.account
WHERE 
    cq
.quest xxx
ORDER BY 
    from_unixtime
(cq.timeDESC
LIMIT 0 
300

Выводит гм онлайн

PHP код:

SELECT 
    c
.namec.class, c.racea.gmlevel 
FROM 
    characters
.characters c 
INNER JOIN 
    realmd
.account a 
ON 
    a
.id c.account 
WHERE 
    a
.gmlevel != && c.online 1


Konctantin 12.03.2010 14:52

Убедительная просьба:
Если выкладываете участок кода (как пример) пожалуйста не пишите его 1 строкой,
тот кому он понадобится, должен в первую очередь понимать что и к чему, а не тупо его копировать (во избежания пустых вопросов) .
Желательно делать комментарии в самом коде, поверьте толку от такого примера будет куда больше.

FreeBSD 12.03.2010 15:01

Нужны запросы:

1)Удаление персонажей которые не привязаны к аккаунту.
2)удаление всех лишних записей после удаления персонажей.

mozilla 12.03.2010 16:02

1.
PHP код:

DELETE FROM 
    
`characters`.`characters
WHERE 
    
`accountNOT IN (
    
SELECT id 
        FROM 
`realmd`.`account`
    ); 

2. а вообще вот

FreeBSD 12.03.2010 17:11

Код:

ERROR 1206 : The total number of locks exceeds the lock table size
как избавиться от такой ошибки...? может можно сделать количество запросов чтоб не превышало..?

Вот на этих запросах выдает:
Код:

DELETE `character_account_data`.*
    FROM `character_account_data`
        LEFT JOIN `characters`
        ON `character_account_data`.`guid` = `characters`.`guid`
    WHERE `characters`.`guid` IS NULL;

DELETE `character_achievement`.*
    FROM `character_achievement`
        LEFT JOIN `characters`
        ON `character_achievement`.`guid` = `characters`.`guid`
    WHERE `characters`.`guid` IS NULL;


mozilla 12.03.2010 17:23

Как решение нашел увеличить размер innodb_buffer_pool_size в /etc/my.cnf

Тип обоих таблиц InnoDB, и если вы прочли статью на утдб, то там написано:
Цитата:

запросы пройдут только на mysql 5.1 и выше, и актуальны только для MyISAM
Так что решайте сами, что делать.

KiriX 13.03.2010 14:19

Просьба к автору первого поста - собирать всё в первый пост и, желательно, под спойлер (на этом форуме его функцию выполняет тэг оффтопа), над спойлером краткое описание - что там.

Keni 13.03.2010 17:52

Запрос аккаунты на которых нет персонажей:
Код:

#Выборка
SELECT * FROM `realmd`.`account` where `id` not in (select account from `mangos`.`character`);
#Удаление:
DELETE FROM `realmd`.`account` where `id` not in (select account from `mangos`.`character`);

Старое помойму

Новое:
Код:

#Выборка
SELECT * FROM `realmd`.`account` where `id` not in (select account from `characters`.`characters`);
#Удаление:
DELETE FROM `realmd`.`account` where `id` not in (select account from `characters`.`characters`);


FreeBSD 13.03.2010 18:43

Спасибо, исправил.

FreeBSD 18.03.2010 17:18

подскажите, как запросом сделать все логины(аккаунты) в базе большим регистром? Например был plauer, после запроса станет PLAUER.

Desperado 18.03.2010 17:26

Код:

UPDATE realmd.account SET username = UPPER(username)
p.s. чтобы остальные не задавали подобных вопросов: изменяет регистр всех записей в выбранном поле.

Rage Hunter 19.03.2010 02:04

Не коректное! Много мусора останется!
Код:

DELETE FROM `character_inventory` WHERE `item_template` IN ('entry');
Коректное!
Код:

DELETE FROM `item_instance` WHERE `guid` in (SELECT item FROM `character_inventory` WHERE item_template IN ('entry');
DELETE FROM `character_inventory` WHERE item_template IN ('entry');


pdx15 19.03.2010 21:39

вайпаем шмот, с инвенторя, гб, банка, почты итд
Код:

DELETE FROM item_instance WHERE CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ' ', 4), ' ', -1) AS UNSIGNED)=номер шмотки;
DELETE FROM item_instance WHERE CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(data, ' ', 4), ' ', -1) AS UNSIGNED)=номер шмотки;
DELETE FROM `auctionhouse` where `itemguid` not in (SELECT `guid` FROM `item_instance`);
DELETE FROM `character_inventory` where `item` not in (SELECT `guid` FROM `item_instance`);
DELETE FROM `guild_bank_item` where `item_guid` not in (SELECT `guid` FROM `item_instance`);
DELETE FROM `mail_items` where `item_guid` not in (SELECT `guid` FROM `item_instance`);
DELETE FROM `character_gifts` where `item_guid` not in (SELECT `guid` FROM `item_instance`);

удаляем мусор от удалённых чаров
Код:

DELETE FROM `item_instance` WHERE `guid` NOT IN (SELECT `itemguid` FROM `auctionhouse`) AND `guid` NOT IN (SELECT `item_guid` FROM `character_gifts`) AND `guid` NOT IN (SELECT `item` FROM `character_inventory`) AND `guid` NOT IN (SELECT `item_guid` FROM `guild_bank_item`) AND `guid` NOT IN (SELECT `item_guid` FROM `mail_items`);

Щачло 28.03.2010 19:30

Кстате о запросе "Пак запросов от LLIbIcpEP на чистку базы:"

выполнил я его и как по волшебной палочке сервер крашиться каждые 4-5 минут ,ну в общем постоянно.
хотя посмотрел и выглядит он на отлично.

ice74 28.03.2010 20:31

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

DeusModus 29.03.2010 16:30

Есть некая таблица

id | sessionID | somethingID | time | ip

Данные заносятся при каждом посещении пользователем определенной страницы. Простой insert.
Раз в N мне необходимо считывать и обрабатывать информацию.
Случаются вот такие ситуации:
1 session123 666 time 127.0.0.1
2 session222 666 time 127.0.0.1

Можно ли как-то удалить подобные дубликаты? Из этой строки, я бы хотел оставить либо первый, либо второй вариант.

Т.е. убрать дубли по sessionID-somethingID и ip-somethingID.

ghostpast 29.03.2010 20:21

Цитата:

Сообщение от DeusModus (Сообщение 3387)
Есть некая таблица

id | sessionID | somethingID | time | ip

Данные заносятся при каждом посещении пользователем определенной страницы. Простой insert.
Раз в N мне необходимо считывать и обрабатывать информацию.
Случаются вот такие ситуации:
1 session123 666 time 127.0.0.1
2 session222 666 time 127.0.0.1

Можно ли как-то удалить подобные дубликаты? Из этой строки, я бы хотел оставить либо первый, либо второй вариант.

Т.е. убрать дубли по sessionID-somethingID и ip-somethingID.

может имеет смысл создать в таблице уникальные сложные ключи (sessionID, somethingID) и/или (ip, somethingID) - в этом случае вставить одинаковые значения пары (sessionID, somethingID) и/или (ip, somethingID) не получится, а значит не придется удалять эти дубликаты.
или требуется удалить уже существующие дубликаты?

tempura 29.03.2010 20:29

судя по всему - это статистика. В статистике невозможно поставить уникальные значения на поля.

DeusModus 30.03.2010 13:47

Цитата:

Сообщение от ghostpast (Сообщение 3394)
может имеет смысл создать в таблице уникальные сложные ключи (sessionID, somethingID) и/или (ip, somethingID) - в этом случае вставить одинаковые значения пары (sessionID, somethingID) и/или (ip, somethingID) не получится, а значит не придется удалять эти дубликаты.
или требуется удалить уже существующие дубликаты?

Да, в таблице уже 20-30 тысяч записей.

Konctantin 30.03.2010 13:52

Создать временную таблицу, скопировать distinct записи и потом сделать truncate нашей таблице и переписать данные с временной таблицы.

DeusModus 30.03.2010 13:55

Цитата:

Сообщение от Konctantin (Сообщение 3427)
Создать временную таблицу, скопировать distinct записи и потом сделать truncate нашей таблице и переписать данные с временной таблицы.

id | sessionID | somethingID | time | ip
Ни по одному из этих столбцов нельзя выбрать только DISTINCT сохраняя корректность данных.
Да и смысл в том, что для каждого пользователя присутствует несколько записей. Удалить же нужно только дублирующие по смыслу.
Или я что-то не понял?

FreeBSD 01.04.2010 18:26

помогите из этого запроса

Код:

SELECT * FROM `character_inventory` WHERE (`item_template`=xxx);
сделать чтоб выводил ник персонажа.


во, сделал, только не знаю правильно или нет, но работает=)))

Код:

SELECT
    `characters`.`name`
  FROM `characters`, `character_inventory`
  WHERE `characters`.`guid` = `character_inventory`.`guid` AND `character_inventory`.`item_template` = 'xxx';


gR4mm 01.04.2010 23:30

Цитата:

Сообщение от FreeBSD (Сообщение 3580)
во, сделал, только не знаю правильно или нет, но работает=)))

Код:

SELECT
    `characters`.`name`
  FROM `characters`, `character_inventory`
  WHERE `characters`.`guid` = `character_inventory`.`guid` AND `character_inventory`.`item_template` = 'xxx';


ну тогда уж лучше так

Код:

select c.name
from characters c
        join character_inventory ci on ci.guid = c.guid
where ci.item_template = 23345;


gR4mm 01.04.2010 23:36

Цитата:

Сообщение от DeusModus (Сообщение 3387)
Есть некая таблица

id | sessionID | somethingID | time | ip

Данные заносятся при каждом посещении пользователем определенной страницы. Простой insert.
Раз в N мне необходимо считывать и обрабатывать информацию.
Случаются вот такие ситуации:
1 session123 666 time 127.0.0.1
2 session222 666 time 127.0.0.1

Можно ли как-то удалить подобные дубликаты? Из этой строки, я бы хотел оставить либо первый, либо второй вариант.

Т.е. убрать дубли по sessionID-somethingID и ip-somethingID.

Получить последние записи из дублей можно так:

если считать что запись в таблице можно определить по полям somethingID, ip

Код:

select max(id)
from sometab t
group by somethingID, ip
having count(id) > 1


leeas 16.04.2010 06:27

Народ, извиняюсь, может быть не там вопрос задаю.

Работаю с Личным Кабинетом. Необходимо создать чара в базе. Но нет возможности "завести" сервер.

Если это возможно, можете привести sql запрос на создание в базе персонажа 1 лвл? Благодарю заранее.

Anti 16.04.2010 08:20

Персонажей лучше создовать через игру, в противном случая надо строго копировать методику создания и писать какой-то скрипт или нечто похожее. Иначе ничего не получиться.

ЗЫ А какой смысл создавать перса, если вы не можете поднять сервер?

VinD 09.05.2010 01:46

У меня есть вопрос. Вот например есть такой запрос
SELECT * FROM `honor` WHERE `kills` >0
А как сделать так чтоб сначала проверялось наличие таблицы honor, и только потом осуществлялась выборка из неё. Пробовал что-то вроде
IF EXISTS (SELECT * FROM `honor` WHERE `kills` >0)
но так не работает.

10.05.2010 00:20

Цитата:

Сообщение от VinD (Сообщение 5970)
У меня есть вопрос. Вот например есть такой запрос
SELECT * FROM `honor` WHERE `kills` >0
А как сделать так чтоб сначала проверялось наличие таблицы honor, и только потом осуществлялась выборка из неё. Пробовал что-то вроде
IF EXISTS (SELECT * FROM `honor` WHERE `kills` >0)
но так не работает.

Код:

SELECT COUNT(*)
FROM information_schema.tables
WHERE table_schema = 'mangos'
AND table_name = 'creature';

если результат 0, таблицы creature нет =)))

Incognito 10.05.2010 17:31

Как сделать ограничение на ввод цифр? типа от 2 до 5, от 1 до 3 и т.п.?

10.05.2010 19:16

Цитата:

Сообщение от Incognito (Сообщение 6072)
Как сделать ограничение на ввод цифр? типа от 2 до 5, от 1 до 3 и т.п.?

тип SET или ENUM вполне подходит...хотя все зависит от тз. Желательно такое до попадания в базу учитывать....:mda:

feanorco 14.05.2010 12:00

Суть проблемы: есть необходимость с сайта отправить почту игроку 123 с итемом, ну допустим,ИД 123456 и количество 15 штук..... ну и текстом... "здраствуй вася"
чет еще смутно понимаю как почта работает :(
подсобите плз

FreeBSD 14.05.2010 16:34

запросом в базу это не как не сделать, если ток через telnet... есть голосовалки для пабликов, отдуда повыдирай нужные коды и будет тебе счастье)

feanorco 14.05.2010 22:07

хм.. телнет чтож и на тм спс. щя бу чет думать.

CruncH 14.05.2010 23:04

Цитата:

Сообщение от FreeBSD (Сообщение 6447)
запросом в базу это не как не сделать, если ток через telnet... есть голосовалки для пабликов, отдуда повыдирай нужные коды и будет тебе счастье)

Разве? Насколько помню это было реализовано в MMFPM (мини менеджер фор чего то там мангос), так что это сделать можно, только запрос будет не маленький и придется заполнять 2 таблицы и не 1 раз.

Hantet 18.05.2010 13:15

Сделать через запрос возможно, но слишком много возни, большой риск уронить сервер. ИМХО telnet в Мангосе есть, по этому юзай telnet. Тем более там буквально несколько строк когда нужно чтобы отправить самую заковыристую команду. Веселее всего шутдаун через сайт ставить :)

CruncH 18.05.2010 21:16

С телнетом через сторонние либы не возился, и думаю там много подводных камней.
Но есть же SOAP специально прикрученный для этого дела.
Для Php рабочий пример лежит в сорцах мангоса mangos/contrib/soap/example.php
нужно только поставить\включить библиотеку.
Для питона пример работы был описан тут в блоге.

Lightunit 19.05.2010 07:25

Выводит список вещей, которые не привязаны к письму.
PHP код:

SELECT FROM `mail_itemswhere `mail_idnot in (select `idfrom `mail`); 

Отправляет вещи игроку, которые не привязаны к письму.
PHP код:

INSERT 
INTO 
`mail
SELECT `mail_id`, '0''61''0''0', `receiver`, 'System repaired!''Message generate System!''1'unix_timestamp() + 3600 24 30unix_timestamp(), '0''0''0'
FROM `mail_items
WHERE `mail_idnot in (SELECT `idFROM `mail`)
GROUP BY `mail_id


qazarius 25.05.2010 16:57

Подскажите пожалуйста запрос который выводил бы список персонажей и их ip


Текущее время: 19:24. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS