
Lucky
23.08.2017
11:53:24
Ну как, у меня есть по таблице версий для каждой таблицы с данными. И в таблице версий обозначены id тех полей, которые нужно экпортировать.
Остаётся вопрос: во что удобнее экспортировать?

Yaroslav
23.08.2017
11:53:57
если вникнуть, то думаю структура пошатнеться
бюджетный гит какой-то)

Google

Fike
23.08.2017
11:54:26
а что за проблема-то решается?

Yaroslav
23.08.2017
11:54:32
гит для бд
походу

Fike
23.08.2017
11:54:34
почему репликация не репликация?

Lucky
23.08.2017
11:55:55
Чтобы сбрасывать в кеш не всю бд, а только изменения

Yaroslav
23.08.2017
11:58:08
звучит дико

Lucky
23.08.2017
12:00:36
Тогда есть другой вопрос: есть несколько UPDATE, которые по триггеру будут менять одно значение всем изменённым полям?

Fike
23.08.2017
12:00:50
вы насилуете бд только из-за необходимости корректной инвалидации кэша?
oh my

Yaroslav
23.08.2017
12:02:23
ибо на данный момент ваши действия вызывают много вопросов.

Fike
23.08.2017
12:02:42
во-первых сбрасывать в кэш все, что поменялось - это плохая идея, потому что кэш предназначен не для свежих данных, он предназначен для горячих данных
это совсем разные множества

Google

Fike
23.08.2017
12:04:35
во-вторых правильно ли я понял, что данные гоняются между двумя бд?

Lucky
23.08.2017
12:05:08

Fike
23.08.2017
12:06:33
Это никак не противоречит сказанному. Хоть раз в пять минут перекидывайте, хоть сразу - вам не измененные сущности нужно туда запихивать, а горячие.

Lucky
23.08.2017
12:08:23
Ну так меняются только горячие данные или я не понимаю смысла термина горячий?

Аггей
23.08.2017
12:09:21
Вообще говоря мне задача напомнила другую - получение консистентных подмножеств БД (типа 5% база для dev)

Fike
23.08.2017
12:10:03
Горячие - это те данные, которые постоянно запрашиваются. Если пользователь зашел, сменил у себя в фамилии "е" на "ё" и вышел на месяц, то это никоим образом не горячие данные

Lucky
23.08.2017
12:12:16
Ну вот опустим не горячие изменения, а как мне всё-таки горячие передавать?

Fike
23.08.2017
12:13:02
Почему приложение не занимается этим и почему целиком не обновлять данные в ин-мемори таблице?

Lucky
23.08.2017
12:15:20
Зачем передавать больше если можно передавать меньше?
И ок, как мне тогда передать целую новую таблицу?

Fike
23.08.2017
12:17:43
Вы уже разбрасываетесь ресурсами и пытаетесь сэкономить на передаче данных в оперативу
С новой таблицей вообще не понял. У вас приложение на лету создает таблицы?

Lucky
23.08.2017
12:20:23
Куда-то в дебри уходим. Как лучше вывести данные из бд?

Fike
23.08.2017
12:22:13
Репликацией?
Триггерами, если это внутри одного инстанса?

Lucky
23.08.2017
12:22:54
Не внутри одного. Репликация тоже не подходит.

Fike
23.08.2017
12:23:14
Не подходит почему?

Lucky
23.08.2017
12:28:33
Потому, что принимать будет уже не mysql

Google

Lucky
23.08.2017
12:28:51
А sqlite

Fike
23.08.2017
12:31:58
и вы все еще хотите решить это вне приложения?
дублируйте инсерты/апдейты в две стороны, это кажется единственное решение

Lucky
23.08.2017
12:34:12
К сожалению это плохое решение, буду продолжать поиски.


Павел
23.08.2017
13:20:42
Просто чтобы было яснее - при составном первичном ключе a, b, c следующие записи наложатся друг на друга:
a | b | c | d |e
============
1 | 2 | 3 | 4 | 5
1 | 2 | 3 | 0 | null
Потому что набор (a, b, c) у них совпадает. А вот эти записи уже будут записаны как разные строки:
a | b | c | d |e
============
1 | 2 | 2 | 4 | 5
1 | 2 | 3 | 4 | 5
Потому что c в этих двух случаях имеет разное значение и (1, 2, 3) != (1, 2, 2). Записей, у которых при этом a = 1 и b = 2 может быть сколько угодно много.
Спс все получилось - даже 2-й кюч не пришлось задействовать - только 1 - вот сам кверик : insert into areas (com_port, phone, area, acct, acct_counter, data_incoming, time_incoming)
SELECT 'COM4', '+99999999999', '12', '143848', '1050', '2017-07-26', '07:50:45' FROM areas
WHERE NOT EXISTS (SELECT * FROM areas
WHERE com_port = 'COM4' AND phone = '+99999999999' AND area = '12'
AND acct = '143848' AND acct_counter = '1050' AND data_incoming = '2017-07-26'
AND time_incoming = '07:50:45' AND id != 0 )
LIMIT 1;


Fike
23.08.2017
13:22:36
вам не нужно делать весь этот лес с select where not exists
если задача только защититься от повторных добавлений, то вот
сделайте primary key по всем столбцам. или уникальный вторичный. потом используйте insert ... on duplicate key update com_port = com_port

Павел
23.08.2017
13:25:01
пробовал, в мускуле праймари только 1 - или я что то не понимаю..., а уникальный вторичный можно - но тогда структура com_port = com_port - IDE не понимает и говорит что двойственность поля
мой код может быть несколько сложен и занимает больше процессорного времени - но он работает ))
еще раз спасибо за участие )

Fike
23.08.2017
13:30:17
on duplicate key update com_port = VALUES(com_port)?

Павел
23.08.2017
13:30:40
попробую )

Fike
23.08.2017
13:30:42
хотя если IDE ругается, это может быть просто недоработка или вовсе соответствие более старому диалекту
Есть еще INSERT IGNORE, но полная заглушка сообщений может быть нежелательна. Еще одна альтернатива - REPLACE, но он, насколько понимаю, всегда триггернет физическую запись (ON DUPLICATE KEY UPDATE, опять же насколько понимаю, при соответствии старой/новой записи не будет ничего писать)

lost
23.08.2017
15:14:28

Maxim
25.08.2017
10:39:07
Есть два поля в таблице
idemp: 195
idemp_own: 205
как указать в запросе, что если одно пустое, то получть второе поле?

Alexey
25.08.2017
10:40:40
IFNULL(field1, field2) или IF(field1 = '' OR field1 is NULL, field2, field1)

Maxim
25.08.2017
10:41:11
спс, попробую

Google

Senpos
28.08.2017
12:06:30
Всем привет!
Помогите пожалуйста составить запрос. Изначально казалось, что все просто, а по итогу ничего не могу решить.
Есть две таблицы: acct_in (http://i.imgur.com/LTFbdW4.jpg) и acct_out (http://i.imgur.com/LFTMyIw.jpg).
Текущий запрос получает такие данные, что почти идеально: http://i.imgur.com/24v1HuH.jpg (SQL-запрос: https://gist.github.com/Senpos/f4904d4acd9c6d6867d3cb703b3a7a5e )
И вроде все хорошо, кроме одного: если в первой (или второй) таблице существует пара IP/ TS, а в другой нет, то в результате я не получу это значение. А хотелось бы. Т.е. желаемый вид базы был бы таким: http://i.imgur.com/gnyLxAc.jpg (и другие две уникальные пары)
Версия базы последняя что доступна на сайте, 5.7

Yaroslav
28.08.2017
12:08:22
Left join юзай
а не inner join

Senpos
28.08.2017
12:13:23
Left join юзай
Все так же. Для примера, обращу внимание, что IP с *.252 в конце есть ТОЛЬКО во второй таблице.
У меня получилось получить значение bytes из него при помощи RIGHT JOIN, но в таком случае я получаю (NULL) и в полях ip, ts, что очевидно, ведь SELECT я делаю по левой таблице, а эти данные в правой.
Как эту проблему можно обыграть, когда не уверен, в какой из таблиц будут уникальные данные?

Yaroslav
28.08.2017
12:13:47
нет желания разбираться в вашем запросе
читайте про join-ы
+ подумайте правильная ли у вас структура

Senpos
28.08.2017
12:15:47
Структуру создаю не я, а необходимый софт, от нее не убежать.
Про Джоины читал и все еще читаю, не особо помогло. Скорее, даже не они тут основная загвоздка.

lost
28.08.2017
12:32:47
аналог full outer join, которого нет в mysql

Senpos
28.08.2017
12:34:14

lost
28.08.2017
12:34:43

Ринат
28.08.2017
13:39:10
Парни, как одним запросом средства mysql провернуть такое
есть таблица, которая не очень круто в другом поле хранит сссылки на связные записи в этой же таблице
хранистся что то типа ,1,2
например есть запись с id=3, в поле bound хранится ссылка на связные записи или запись, например ,4
так вот мне нужно по текущему на вход id (3) , вытащить связные, и всё это вместе уже вставить в запрос выборки в другой табличке (типа table_id IN (3,4))

Dmitriy
28.08.2017
13:44:34
Не поленись и в отдельную таблицу эту дрянь засунь

Ринат
28.08.2017
13:45:35
пока нереализуемо увы

Dmitriy
28.08.2017
13:46:37
Спец софт?

Google

Ринат
28.08.2017
13:47:03
большой проект работающий
не хочется воять на стороне серверного языка втаскивать и обратно склеивать выборки

Dmitriy
28.08.2017
13:47:48
Сходу я пока не могу представить, как это быстро и безопасно вытаскивать

Ринат
28.08.2017
13:47:54
мб более менее нормально запросом можно

lost
28.08.2017
13:48:28
Динамическим запросом только

Dmitriy
28.08.2017
13:48:38
По рукам бить нужно таких кодеров

Ринат
28.08.2017
13:48:48
да бить

lost
28.08.2017
13:49:04
можно конечно через find_in_set сделать запрос обычный, но работать он будет очень долго

Ринат
28.08.2017
13:49:05
я не вижу сложности сделать сводную таблицу, в чём экономия была не понятно
может я не до конца обхяснил пример
сейчас скину пример запроса