
lost
09.08.2017
09:59:40
выбирай что больше нравится

Danil
09.08.2017
10:01:53
джон я не понимаю как сделать тут ибо условие для селекта есть один из результатов вложенного селекта. про IN сейчас почитаю
короче с IN запрос ошибку не выдает, но возвращает опять 1 запись а не таблицу результатов ((((
короче вроде простая задача и никакого простого решения ( все примеры что я нашел какие то монструозные с мегаджойнами и прочим.

Google

lost
09.08.2017
10:56:11
задача простая, только поставлена некорректно и не хватает исходных данных

Danil
09.08.2017
11:43:28
вот такой запрос работает, но только если второй запрос возвращает один столбец (( и еще лезут NULL для значений 'StencilNo' из второй таблицы если их нет в первой
SELECT * , (
SELECT sum( useCount )
FROM stencil_history
WHERE stencil_history.StencilNo = view_stencil_list_in_use.StencilNo
)
FROM view_stencil_list_in_use
если возвращать несколько полей ругается - я не пойму почему

Dmitriy
09.08.2017
11:44:53
чот уже изврат какой-то

lost
09.08.2017
11:46:50
точно по той же причине, 1 значение скалярный подзапрос должен возвращать


Danil
09.08.2017
11:47:49
задача простая, только поставлена некорректно и не хватает исходных данных
я выше описал задачу вроде с подробностями. есть исходные 2 таблицы. в первой список предметов с несколькими параметрами. во второй история операций с этими предметами. ключевым является имя предмета - поле 'StencilNo'. нужно из первой сделать список в котором параметр 'InUse' = 'USE' и из второй вытащить значения параметров 'Tension1' ... 'Tension5' и сумму по полю 'Count'
у меня есть запрос (и вьюшка) для выборки из первой таблицы
есть рабочий запрос, который выдает строку из второй таблицы по конкретному 'StencilNo'
нужно сделать общую таблицу из первой выбокри и результатов вторых селектов для каждого итема
и я не знаю как мне сделать итерацию сторого запроса по результату первого селекта
надеюсь так понятно
вот такие селекты:
1) SELECT id,StencilNo,Chassis,Side,MakeDate,BarePCB,Thickness,InDate,StorageNo FROM stencil_list
WHERE Status = 'Use'
2) SELECT StencilNo , Tension1 , Tension2 , Tension3 , Tension4 , Tension5 , sum( useCount )
FROM stencil_history
WHERE
StencilNo = '1234567890'
ORDER BY id DESC
LIMIT 1

Google

lost
09.08.2017
11:52:08
точнее некорректный

Danil
09.08.2017
11:52:33
всмысле неверный? он возвращает мне именно нужный результат
я проверял на своих данных - все сходится

lost
09.08.2017
11:53:06
у тебя возвращаются колонки, не перечисленные в агрегатной функции, мускуль имеет полное право вернуть случайное значение в эту колонку :)

Danil
09.08.2017
11:53:35

lost
09.08.2017
11:54:22
хотя там лимит 1 есть...

Danil
09.08.2017
11:54:51
формально он должен вернуть сумму по Count со всей таблицы - это правильно, и значения tension1~Tension5 для записи с максимальным id - т.е. последней, и это тоже правильно
но вот мне нужно пройтись циклом по всему списку 'StencilNo' из другой таблицы и объединить результаты
и вот тут я и застрял

lost
09.08.2017
11:56:40
а зачем тебе limit 1 если ты выбираешь сумму по уникальному stencilNo
кстати сортировка будет уже после агрегации, так что ты сортируешь единственную строку с агрегацией что в принципе смысла не имеет
SELECT s.StencilNo , SUM(s.useCount)
FROM stencil_history s
JOIN stencil_list ss ON s.StencilNo = ss.StencilNo
WHERE
ss.Status = 'USE'
GROUP BY 1
почему бы не сделать так

Danil
09.08.2017
12:08:54
сумма нужна по всей таблице, а вот другие поля только от последней записи

lost
09.08.2017
12:10:50

Danil
09.08.2017
12:14:22
а кстати поиск в mysql case sensitive? или это зависит от настроек таблицы?
типа UTF8_CI или _CS?

lost
09.08.2017
12:14:41
поиск чего? строковых значений?

Google

Danil
09.08.2017
12:14:57
ну вот сравнение строк в селектах?
типа USE и Use одинаково или нет

lost
09.08.2017
12:15:41
зависит от того как сохраняешь

Danil
09.08.2017
12:15:59
ок, допустим такой запрос выдает мне табличку из ключевого поля и суммы по значению - устраивает.
теперб нужно сделать также но табличка должна содержать последнюю запись для каждого уникального значения поля StencilNo
вот тут у меня идеи и кончаются (
единичный рабочий запрос такой
SELECT StencilNo , Tension1 , Tension2 , Tension3 , Tension4 , Tension5
FROM stencil_history
WHERE StencilNo = 'ХХХХХХХХХ'
ORDER BY DESC LIMIT 1
как такое заджойнит я хз
просто в этом запросе забирается именно самая свежая запись


lost
09.08.2017
12:25:56
SELECT
s.StencilNo ,
SUM(s.useCount),
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension1 ORDER BY s.id DESC), ',', 1) AS Tension1,
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension2 ORDER BY s.id DESC), ',', 1) AS Tension2,
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension3 ORDER BY s.id DESC), ',', 1) AS Tension3
FROM stencil_history s
JOIN stencil_list ss ON s.StencilNo = ss.StencilNo
WHERE
ss.Status = 'USE'
GROUP BY 1
немного магии

Danil
09.08.2017
12:28:39
мматерь божья 0_о еще бы понять что делает:
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension1 ORDER BY s.id DESC), ',', 1) AS Tension1

Vlad
09.08.2017
12:29:01
Всем привет... Выбрать значения из нескольких таблиц через джоин или селект правильней?
есть в таблице список материалов, по остальным таблицам их доп характеристики. Вывел в таблице использовав join ... говорят правильней через селект... Решил спросить у гуру...

lost
09.08.2017
12:33:03

Vlad
09.08.2017
12:33:27
так и сделал... но говорят что правильней через селект...

Danil
09.08.2017
12:33:38
SELECT
s.StencilNo ,
SUM(s.useCount),
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension1 ORDER BY s.id DESC), ',', 1) AS Tension1,
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension2 ORDER BY s.id DESC), ',', 1) AS Tension2,
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension3 ORDER BY s.id DESC), ',', 1) AS Tension3
FROM stencil_history s
JOIN stencil_list ss ON s.StencilNo = ss.StencilNo
WHERE
ss.Status = 'USE'
GROUP BY 1
спасибо тебе, Человечище!

Vlad
09.08.2017
12:33:59
и ещё вопрос...

Danil
09.08.2017
12:35:02
можно ли во вью добавить вычисляемые поля?
можно ли добавить в селект/джоин/вью поля с заданным значением (константа)?

Magic
09.08.2017
12:35:04

Google

Vlad
09.08.2017
12:35:05
ид материала это одна таблица.. а во второй:
ид1 / значение 1
ид1 /значение 2
ид2 / значение 1
ид2 /значение 2
Это то как включить в результат запроса?

lost
09.08.2017
12:35:38

Vlad
09.08.2017
12:36:10
вы меня опять путаете... джоин или селект?

lost
09.08.2017
12:36:24
джоин отдельно без селекта не используется
если что

Vlad
09.08.2017
12:38:05
как из второй таблицы вытянуть 2 значения...

lost
09.08.2017
12:39:28
а значений может быть от 0 до N ?

Danil
09.08.2017
12:39:45
а чё нет?
ну с вычисляемыми я уже гуглю, а вот как быть с константами?
как можно прописать выдачу текстового значения поля по условию - типа если >5 то пишем 'GOOD' если меньше то 'BAD' ?

lost
09.08.2017
12:40:03

Vlad
09.08.2017
12:41:25
у каждого значения есть доп_ид

Danil
09.08.2017
12:41:58
ок, пошел в гугл. спасибо!
а это все не сильно нагружает сервак? насколько такие вычисления дороги в плане ресурсов? как я понимаю наиболее "дорога" именно выборка из БД так как ИО и прочие операции. математика же семечки для проца. это так?

lost
09.08.2017
12:43:03

Danil
09.08.2017
12:43:59
ну я в плане того, когда стоит остановится и пренести обработку данных уже в логику приложения и забирать кучу простыми селектами

lost
09.08.2017
12:43:59
на примере твоего запроса - самое дорогое будет group_concat

Danil
09.08.2017
12:44:35
я кстати, так и не вкурил как именно оно работает (

lost
09.08.2017
12:44:37

Danil
09.08.2017
12:46:09
чем быстрее - тем лучше
ну написать эту логику в приложении тоже не мнгновенно. если БД отдает уже готовые форматированные данные то это ооочень удобно. а вот реализовать внутри приложения функции встроенные в MySQL как то глупо КМК

lost
09.08.2017
12:47:50
достаточно просто узнать те вещи, которые не стоит делать средствами sql

Google

Danil
09.08.2017
12:49:07
например какие? если не сложно написать

lost
09.08.2017
12:52:02
полнотекстовый поиск, например

Danil
09.08.2017
12:54:13
короче разобрал магические записи по частям:
SUBSTRING_INDEX(GROUP_CONCAT(s.Tension1 ORDER BY s.id DESC), ',', 1) AS Tension1
похоже нужно быть нехерово подкованным в SQL чтоб такое сообразить. это реально круто
GROUP_CONCAT() будет тормозное если записей дохера как я понял, и осбо ускорить это не получится ((
ну посмотрим, что нам сервак на это скажет. частота запросов мизерная раз в 5-10 минут, длина базы порядка 20000 записей и неспеша растет
и как тогда делают посик по ключевым словам на всяких форумах там ?? ведь они все рабодают с БД, или нет?

lost
09.08.2017
12:58:41

Danil
09.08.2017
13:49:52
короче сджойнил я 2 вьюшки в 3ю и все запллясало как надо.
lost soul - спасибо большое за помощь!

Vlad
09.08.2017
13:55:59
Лососоул .. 2е спасибо

lost
09.08.2017
13:56:08
вот ща обидно было

Vlad
09.08.2017
13:56:22
*Lost soul
Пардоньте... Автозампна на телепоне

lost
09.08.2017
13:56:58
можно вот так делать:
@acromegale

Alexander
09.08.2017
15:14:12
Хелоу! кто нибудь Multi-Source репликацию настраивал?

lost
09.08.2017
15:15:21
а вы с какой целью интересуетеся?

Alexander
09.08.2017
15:16:02
да вот. хочу попробовать настроить. вроде есть где это полезно будет. пока с полтыка не получается ?

lost
09.08.2017
15:16:45
насколько я помню, там нужно делать change master в отдельный канал репликации
и собстно на этом все трудности настройки...