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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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

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

IFKey



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

Цитата:
INSERT IGNORE INTO registration (email,pol,adress,fio) VALUES ('mail@1','s','add','fio');

Как сделать так чтобы при вставке игнорировалась вставка записи, если такой email уже существут? Запись что выше, вставляет дубликаты не глядя.

Всего записей: 331 | Зарегистр. 20-03-2007 | Отправлено: 22:40 20-09-2012 | Исправлено: IFKey, 22:43 20-09-2012
MbIJIO



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
подскажите пожалуйста как сделать правильный апдейт
 
UPDATE eav_entity_attribute
SET attribute_group_id =  
 
(SELECT eag2.attribute_group_id FROM  eav_attribute_group eag2 WHERE eag2.attribute_set_id IN  
    (SELECT attribute_set_id FROM eav_entity_attribute WHERE attribute_id = 1474 AND attribute_group_id IN  
        (SELECT attribute_group_id FROM  eav_attribute_group WHERE attribute_group_name <>  "General")
    )
AND eag2.attribute_group_name =  "General" AND eag2.attribute_set_id = eea.attribute_set_id)
 
WHERE attribute_id = 1474 AND attribute_group_id IN (SELECT eag.attribute_group_id FROM  eav_attribute_group eag WHERE eag.attribute_group_name <>  "General")
 
это мой скрипт, но на него ругается, дело в том на сколько я знаю при апдейте нужно указывать одно значение, тут же получается целый массив, как можно обновить таблицу с большим колличеством данных

Всего записей: 175 | Зарегистр. 12-12-2006 | Отправлено: 17:31 21-09-2012
MbIJIO



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

Всего записей: 175 | Зарегистр. 12-12-2006 | Отправлено: 12:05 27-09-2012
DeADMoHAX



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Господа, помогите плз реализовать
 
Есть 2 таблицы - объектов и их перевозок
Нужно вытянуть сумму ставок перевозок каждого объекта, при этом учитывая кол-во объектов в перевозке, и учитывая, что объект мог попасть в другую перевозку в виде дочернего.
 
Описание полей таблицы pr_transfers:
rate - ставка
wids_num - кол-во объектов в перевозке
wid - ид основного объекта
add_wids - дочерние объекты, в виде ид1,ид2,ид3...
 
ps_ws
uid - ид юзера, за которым закреплен объект
wid - ид объекта
 

Код:
SELECT SUM(pr_transfers.rate/pr_transfers.wids_num) as sum,pr_transfers.wid, pr_ws.uid FROM pr_transfers,pr_ws WHERE (pr_ws.wid = pr_transfers.wid OR pr_transfers.add_wids LIKE CONCAT('%', pr_ws.wid)) GROUP BY pr_transfers.wid;

считается неправильно..
 
По идее -  
Вытягиваем иды объектов из таблицы объектов и получаем сумму поля rate всех записей, деленного на поле wids_num в таблице рейсов, где либо иды объекта совпадают с текущим, либо наш текущий ид присутствует в спец. поле дочерних объектов.

Код:
CREATE TABLE `pr_transfers` (
  `tid` int(11) NOT NULL auto_increment,
  `wid` int(8) NOT NULL,
  `rate` tinytext,
  `add_wids` tinytext,
  `wids_num` tinyint(4) unsigned default '1',
  `uid` varchar(64) NOT NULL,
  PRIMARY KEY  (`tid`),
  UNIQUE KEY `tid` (`tid`),
) ENGINE=MyISAM AUTO_INCREMENT=4724 DEFAULT CHARSET=cp1251;
 
CREATE TABLE `pr_ws` (
  `wid` int(8) NOT NULL,
  `uid` varchar(64) NOT NULL,
  PRIMARY KEY  (`wid`),
  UNIQUE KEY `wid` (`wid`),
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


----------
dmlabs.ru || hackconnect.ru
Выгодно России – значит, хорошо. Не выгодно России – пошёл на хер.

Всего записей: 1367 | Зарегистр. 03-02-2005 | Отправлено: 12:20 05-10-2012 | Исправлено: DeADMoHAX, 23:26 06-10-2012
alexey980

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть простая, но очень длинная таблица users с одним поле id.  
время от времени нужно добавлять в таблицу пачками новые id, но чтобы при это дубликаты не добавлялись,  
и выводить результат, то есть только те id, которые были добавлены при выполнении последнего запроса.
 
например, исходная таблица:  
ааа
bbb
 
добавляем список:
aaa, xxx, bbb, yyy
 
конечная таблица:
aaa
bbb
xxx
yyy
 
на выходе:  
xxx, yyy
 
пока я пришел к двум вариантам решения задачи.  
 
вариант 1:
в исходной таблице заводим 2 поля Num (INT, PRIMARY KEY, AUTO_INCREMENT) и id (VARCHAR, UNIQUE).  
тогда типовая операция будет включать следующие запросы:
 
шаг А. вычисляем номер последней записи таблицы и запоминаем результат в $Num_MAX
SELECT MAX(Num) FROM users  
 
шаг B. добавляем в таблицу новые id (дубликаты игнорируем)
INSERT IGNORE INTO users(id) VALUES('aaa'),('bbb'),('xxx'),...
 
шаг C. делаем выборку только тех id, которые были добавлены в ходе предыдущего запроса  
SELECT id FROM users WHERE Num > $Num_MAX
 
 
вариант 2:
оставляем в таблице одно поле id, уже без всяких индексов.
 
тогда перед добавлением новых id: aaa, bbb, xxx... делаем предварительную выборку из таблицы вроде
SELECT * FROM users WHERE id IN ('aaa', 'bbb', 'xxx', …)
 
сравнивая эту выборку с входящим списком новых id, удаляем из него дубликаты.
(здесь можно средствами php усечь входящий запрос или регулярными выражениями обойтись)
 
и затем уже этот усеченный список вставляем  в таблицу с помощью обычного INSERT без всяких игноров
INSERT INTO users(id) VALUES('xxx'),('yyy'),…
 
вопрос знатокам:
что будет работать быстрее, если в таблице 2 миллиона id, а добавлять по запросу нужно по 2000 новых id за раз, но чтобы при этом дубликаты не добавлялись.
в первом случае таблица индексная, во втором без индекса.  
индекс же будет тормозить вставку?  
можно ли как-то еще оптимизировать запросы для решения этой задачи?
важна исключительно скорость выполнения запросов.

Всего записей: 96 | Зарегистр. 27-01-2007 | Отправлено: 19:23 30-03-2013 | Исправлено: alexey980, 19:29 30-03-2013
dneprcomp



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
alexey980
все до шага B надо сделать.
шаг B.-добавляем во временную таблицу все новые id  
шаг C.-отфильтровываем уникальные

Код:
INSERT INTO users(id) select id from table_temp left join users on table_temp.id=users.id where users.id is null  

Всего записей: 3922 | Зарегистр. 31-03-2002 | Отправлено: 06:07 31-03-2013 | Исправлено: dneprcomp, 06:10 31-03-2013
wwwww



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть данные:
 
id              parent_id              name                                                                  data_create
1                     0                   Уроки
2                     1                   Бесплатные
3                     1                  за бабло
4                     2                  Супер урок 1
5                     5                     начало супер урока 1
6                     5                     середина супер урока 1
7                     5                     конец супер урока 1
8                     2                  Супер урок 2
9                     8                     начало супер урока 2
10                   8                     середина супер урока 2
11                   8                     конец супер урока 2

 
 
1)
нужно вывести меню ввиде дерева начиная от некоторого id, например только бесплатные уроки, т.е:
id              parent_id              name                                                                  data_create
2                     1                   Бесплатные
4                     2                  Супер урок 1
5                     5                     начало супер урока 1
6                     5                     середина супер урока 1
7                     5                     конец супер урока 1
8                     2                  Супер урок 2
9                     8                     начало супер урока 2
10                   8                     середина супер урока 2
11                   8                     конец супер урока 2

 
2) нужно вывести хлебные крошки начиная от некоего id и до самого первого родителя, те. id=11
id              parent_id              name                                                                 data_create
 
2                     1                   Бесплатные
8                     2                  Супер урок 2
11                   8                   конец супер урока 2

 
 
Взываю о помощи, ибо сам могу написать лишь простенький select(((
 

Всего записей: 323 | Зарегистр. 26-12-2003 | Отправлено: 10:51 29-04-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
wwwww
одним запросом тут не обойтись
PHP,MySQL Путь от элемента до родителя в дереве

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 11:19 29-04-2013
wwwww



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

Цитата:
одним запросом тут не обойтись
PHP,MySQL Путь от элемента до родителя в дереве

Почитал, но судя по дате публикаций это 2007г. А сейчас 2013. Неужто муська за это время не поумнел?
Под оракл мне дружок сказал так будет:
select * from ....
start with parent_id = 8
connect by id = prior parent_id
а под Mysql?

Всего записей: 323 | Зарегистр. 26-12-2003 | Отправлено: 10:38 01-05-2013
quasar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Народ, вопросик на счет следующей-предыдущей записи.
 
Вот ссылка на пример
 
Юзер сортирует, например, телефоны по году. Ему отдается какая-то выборка, он кликает конкретный телефон (мы знаем его ID), переходит на него.  
 
Но я ему хочу ещё показать ссылки на предыдущий и следующий телефон из его прошлой выборки.
 
Но что-то у меня всё время разные результаты, когда юзер использует сортировку.
 
В моем примере он выбрал телефон с ID 555, тогда у него по идее следующий ID 444, а предыдущий 111

Всего записей: 398 | Зарегистр. 29-01-2002 | Отправлено: 15:10 03-05-2013 | Исправлено: quasar, 15:14 03-05-2013
Cheery



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

Цитата:
Ему отдается какая-то выборка, он кликает конкретный телефон (мы знаем его ID), переходит на него.  

а почему вы решили, что следущий и предыдущий будут связаны именно через ID?  
повторите выборку и возьмите то, что перед выбранным ID и после.  


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 20:14 03-05-2013
quasar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
А если выборка "тяжеловесна"?

Всего записей: 398 | Зарегистр. 29-01-2002 | Отправлено: 07:21 04-05-2013
n0named1

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

Цитата:
А если выборка "тяжеловесна"?

Добавь в выборку строку с номером строки. Тогда найдешь предыдущий и следующий номер. По ID ничего не получится при сортировке.

Всего записей: 1 | Зарегистр. 30-11-2009 | Отправлено: 07:46 04-05-2013
quasar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
n0named1
не совсем понял про номер строки. это как?
 

Цитата:
Всего записей: 1 | Зарегистр. 30-11-2009

вы нарушили обет молчания?

Всего записей: 398 | Зарегистр. 29-01-2002 | Отправлено: 16:49 04-05-2013 | Исправлено: quasar, 16:50 04-05-2013
Cheery



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

Цитата:
А если выборка "тяжеловесна"?

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

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 19:48 04-05-2013 | Исправлено: Cheery, 19:48 04-05-2013
quasar



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
а как узнать ID соседних?
 
Про результаты в сессию тоже думал, но, допустим, у него 10 телефнов на страницу. Соответственно запрос LIMIT 0, 10
 
А если он перейдт на 10-ый и захочет кликнуть next?

Всего записей: 398 | Зарегистр. 29-01-2002 | Отправлено: 01:10 05-05-2013 | Исправлено: quasar, 01:11 05-05-2013
Cheery



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

Цитата:
а как узнать ID соседних?  

с помощью javascript
 

Цитата:
А если он перейдт на 10-ый и захочет кликнуть next?

запрашивать не ровно 10, а с запасом, но не выводить последний
 


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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 03:48 05-05-2013
redson



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
если готовые генераторы sql - запросов?

Всего записей: 1340 | Зарегистр. 23-04-2007 | Отправлено: 17:46 11-05-2013
Cheery



.:МордератоР:.
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
redson
http://www.devart.com/dbforge/mysql/querybuilder/
к примеру

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

Всего записей: 52737 | Зарегистр. 04-04-2002 | Отправлено: 21:20 11-05-2013
redson



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Cheery
 
спасибо)

Всего записей: 1340 | Зарегистр. 23-04-2007 | Отправлено: 00:25 12-05-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