Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL Помогите составить запрос

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Открыть новую тему     Написать ответ в эту тему

Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как сделать MySQL запрос который будет выводить по убыванию числа в другой бд и по id?
например есть бд:
 
msl_1

Код:
id|msg
1|text 1
2|text 2
3|text 3
4|text 4
5|text 5
6|text 6

 
и ещё одна бд
msl_2

Код:
 
id_msl|vot
1|2
1|4
1|5
2|5
3|4
4|4
6|3

 
и чтоб на сайте показало в таком порядке
 
text 1
text 2
text 3
text 4
text 6
text 5
 
т.е. сначало подсчитали кол. едениц в msl_2 по id_msl потом выводим их по убыванию.
Но если кол. id_msl совпало (на примере как с text 3 и 4) то там выводим их по возрастанию по id в msl_1

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 11:59 04-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
пример отвратительный.. потому что вывод не отличается от первой таблицы, поэтому внятнее объясните что считается. количество каких единиц??

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 01:45 05-06-2013
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
мы выводим всю информацию с msl_1 по порядку убыванию, по количествам записям в msl_2
т.е. выводим сначало с бд msl_1 1 запись у которой сумма vot в msl_2 по id_msl больше
если сумма совпала, то выводим по убыванию по id записе
т.е. если запись по 5 и 4 номером в бд msl_1 совпали
то выводим с начало 4 а потом уже 5-ю

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 23:48 05-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar

Цитата:
т.е. если запись по 5 и 4 номером в бд msl_1 совпали  
то выводим с начало 4 а потом уже 5-ю

 
это убывание id ??
 
вы вообще объяснять не умеете.
 
неужели нельзя просто сказать, что msl_1.id и msl_2.id_msl связаны друг с другом.  
нужно посчитать сумму msl_2.vot и если для разных msl_1.id она совпадает, то отсортировать по убыванию (возрастанию) этого id?
 
это вы хотели написать?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 23:54 05-06-2013
Sutar



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery

Цитата:
это вы хотели написать?

совершенно верно

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 15:20 07-06-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Sutar
SELECT m1.id FROM msl_1 md1, (SELECT id_msl, SUM(vot) FROM msl_2 GROUP BY id_msl) m2 WHERE m1.id = m2.id_msl
что то такое, не проверял

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:46 08-06-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Добрый день.
Помогите составить запрос, с не совсем стандартной сортировкой
Желательно без использования LEFT или таму подобной фигни
 
Пример таблицы
ID    ParentID
1    0
2    0
3    1
4    2
5    1
6    2
7    1
 
Надо чтобы эти строки отсортировались в следующем порядке:
 
ID    ParentID
1    0
3    1
5    1
7    1
2    0
4    2
6    2
 
Заранее благодарю за помощь.

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 11:03 02-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mishakor

Цитата:
Надо чтобы эти строки отсортировались в следующем порядке

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

Код:
SELECT * FROM table ORDER BY CASE WHEN MOD(ID, 2) = 0 THEN 1 ELSE 0 END, ParentID


----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 11:06 02-07-2013 | Исправлено: Cheery, 11:11 02-07-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
не, не так
 
Выводим главную строку (ID 1 ParentID 0) , за ней дочерние (ID по порядку ParentID 1)
Выводим главную строку (ID 2 ParentID 0) , за ней дочерние (ID по порядку ParentID 2)
 
надеюсь понятно
 
Добавлено:
во чо придумал
 

Код:
 
SELECT ID, ParentID, IF(ParentID = 0, ID, ParentID) AS newORDER FROM table1 ORDER BY newORDER, ParentID, ID
 

 
вроде подводных камней не видно, думаю вопрос закрыт

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 11:17 02-07-2013 | Исправлено: mishakor, 12:27 02-07-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Доброго времени суток, и опять я с MySql запросами)
 
Есть такой запрос
 

Код:
SELECT t1.ID FROM Table1 AS t1
LEFT JOIN Table2 AS t2 ON t2.ParrentID = t1.ID AND t2.Created > (NOW() - INTERVAL 1 MONTH)
WHERE t2.ID IS NULL

 
Таблица 1 связа с таблицей 2 по полям t1.ID = t2.ParrentID
Суть запроса, мне нужно вывести t1.ID всех строк у которых нет соответствующий связи в таблице 2
 
В таблице 1 - 6000 записей
В таблице 2 - 50000 записей
 
Запрос вешает сервак( Подскажите можно ли это сделать каким другим способом

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 06:56 25-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mishakor

Цитата:
Запрос вешает сервак(

запрос правильный.. индексацию связывающих столбцов сделали?
 
если убрать  t2.Created > (NOW() - INTERVAL 1 MONTH) - будет быстрее?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 07:01 25-07-2013 | Исправлено: Cheery, 07:01 25-07-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
индексацию связывающих столбцов сделали

не знаю что это такое(
 

Цитата:
если убрать  t2.Created > (NOW() - INTERVAL 1 MONTH)

тогда запрос не имеет смысла, так как на каждую строчку из таблицы 1 есть хотя бы 1 строка в таблице 2, если убрать то выберутся все 50000 строк. а мне надо только те у которых JOIN отсутствует какраз из за t2.Created > (NOW() - INTERVAL 1 MONTH)
 
Добавлено:
придумал как объяснить попонятнее, представте что t1 это "Фирмы", а t2 это "Заказы", условие что у каждой фирмы есть хотябы 1 заказ, точнее это не условие а факт.
Цель: выбрать все фирмы у которых небыло заказа больше месяца

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 07:12 25-07-2013 | Исправлено: mishakor, 07:19 25-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mishakor

Цитата:
тогда запрос не имеет смысла

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

Цитата:
не знаю что это такое(

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
 
запрос нормальный и, в принципе, проблем быть не должно
что мешает удалить или перенести старые данные в другую таблицу?

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 07:34 25-07-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
запрос нормальный и, в принципе, проблем быть не должно  
что мешает удалить или перенести старые данные в другую таблицу?

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

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

 
убрал дату, результат тод же( получается я в тупике, с одной стороны постоянно растущая база, а с другой начальство которое не даёт времени на переделки
 
подскажите вот так будет правильно добавить связанный индекс

Код:
ALTER TABLE Table1 AS t1, Table2 AS t2 ADD INDEX (t1.ID,t2.ParrentID);

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 08:04 25-07-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
подскажите вот так будет правильно добавить связанный индекс  

нет такого понятия "связанный индекс"
ALTER TABLE TABLE_NAME ADD INDEX (COLUMN_NAME);
индексация производится для ускорения поиска сервером по данному столбцу.
 
если у вас InnoDB движок в таблице, то можно использовать связку через foreign key
http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 08:13 25-07-2013 | Исправлено: Cheery, 08:15 25-07-2013
mishakor

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо за статейки, это новое для меня.
 
Повешал индексы, помогло. Не надолго я так понял, буду думать что делать с архивом.

Всего записей: 65 | Зарегистр. 29-09-2008 | Отправлено: 09:12 25-07-2013
vs6262



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
у меня вопрос, может не совсем касающийся этой темы. просто не хочу плодить темы. я о базах данных очень и очень мало знаю.
 
возможно ли в базе сохранить файлы к примеру картинку да и вообще любой нормальный файл ?

Всего записей: 2235 | Зарегистр. 25-02-2013 | Отправлено: 07:48 21-10-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
возможно ли в базе сохранить файлы к примеру картинку да и вообще любой нормальный файл  

да
upload картинок в базу данных

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 08:02 21-10-2013
sardvd

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
Прошу помощи.
Дано: таблица с товарами Goods, таблица с каталогом Catalog и таблица соответствий товаров разделу каталога gDep.
Например, раздел каталога "Тетрадки" имеет id = 3.
А товар "Тетрадка с Человеком-пауком" (его id = 1) относится и к разделу "Тетрадки", и к разделу "Человек-паук" (у которого id = 5).
По этому поводу в таблице gDep есть такие записи:
gId = 1        gSub = 3
gId = 1        gSub = 5
 
Соответственно, когда мы попадаем в раздел каталога "Тетрадки", то мы выводим товар таким запросом:
SELECT * FROM gDep LEFT JOIN Goods ON gDep.gId = Goods.Id WHERE gDep.gSub = '3'
 
Вроде все просто и понятно.
 
Но есть задача все это добро усложнить. И сделать сортировку результатов по наличию товара.
То есть, чем больше товара сейчас в наличии, тем выше его позиция в выдаче.
Для этого нужно узнать, сколько единиц товара было получено, сколько единиц продано, посчитать разницу и сделать сортировку по этой разнице в обратном порядке.
 
Копаем дальше. Есть таблица Orders. В ней есть поле oSupplier, которое если имеет значение 0 - то это продажа товара, а если не 0 - то это приход товара. А еще есть поле State, которое если больше 2 - то этот заказ полностью обработан.
И есть таблица OrdersContent, в которой указаны конкретные id товара, ну и естественно ссылка на таблицу Orders, т.е. к какому именно заказу относится приход/расход этого товара.
Муть немного, да? Постараюсь раскидать код, как подчет ведется сейчас.
 
SELECT CAST(SUM(IF(Orders.oSupplier <> 0 AND Orders.State > 2, OrdersContent.Col, 0)) as UNSIGNED) AS TotalShip, _
CAST(SUM(IF(Orders.oSupplier = 0 AND Orders.State > 0, OrdersContent.Col, 0)) as UNSIGNED) AS TotalSold _
FROM OrdersContent _
LEFT JOIN Orders _
ON OrdersContent.OrderId = Orders.oId _
WHERE OrdersContent.Good = '1'
 
Выполнив на странице товара этот запрос, мы получам общее количество полученного товара TotalShip и обще количество проданного товара TotalSold.
Вот в принципе, нужно как-то первый запрос вывода товара в каталоге (с одним LEFT JOIN) объединить со вторым запросом подсчета количества полученного/проданного товара (с другим LEFT JOIN), да еще и так, чтобы в первом запросе можно было приписать "ORDER BY TotalShip-TotalSold DESC".
 
Я что-то никак не могу им мозгов дать... Слишком монстроузная конструкция для моего понимания получается )

Всего записей: 126 | Зарегистр. 16-12-2007 | Отправлено: 23:22 04-11-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sardvd

Цитата:
Слишком монстроузная конструкция для моего понимания получается )

пробовали нужную вам выборку реализовать в виде отдельного запроса?
 
SELECT g.* FROM (ваш запрос выше, чтобы в нем были id товара) t, Goods g WHERE t.gid = g.gid

----------
Away/DND

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 22:21 07-11-2013 | Исправлено: Cheery, 22:21 07-11-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

Компьютерный форум Ru.Board » Интернет » Web-программирование » MySQL Помогите составить запрос


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru