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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
 
Если 2 БД, вот структура:
 

Код:
user
----------
id | line | name
1 | 1 | User 1
2 | 2 | User 2
3 | 1 | User 3
 
img
----------
user-id | url
1 | NULL
2 | NULL
3 | ../images/photo/Zkdlc.jpg

 
Как сделать вывод name с БД user убрав повторяющийся (через DISTINCT) line по убыванию по id добавив параметр url с БД img каждому юзеро с соответствующим id?

Всего записей: 1150 | Зарегистр. 15-08-2011 | Отправлено: 23:20 07-03-2016
cabron666



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте,
Хочу спросить, возможно ли создать такой Unique Key:
Имеем 2 таблицы
 
product_features_values
feature_id product_id variant_id    
12 35111 522    
12 35111 523  

 
product_features_values
variant_id variant    
522 White    
523 White  

 
Где:
35111 - ИД продукта
12 - Ид характеристики (Цвет)
White - Цвет
 
Можно ли создать Unique Key, чтобы избежать дублированных цветов?
Спасибо
 


----------
Жизнь - это рояль, клавиша белая, клавиша черная, крышка...

Всего записей: 1342 | Зарегистр. 03-02-2002 | Отправлено: 13:10 20-12-2016 | Исправлено: cabron666, 15:29 20-12-2016
Mavrikii

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

Цитата:
Можно ли создать Unique Key, чтобы избежать дублированных цветов?  

Реальный нет, так как не работает между таблицами. Но триггерами можно сделать.

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 14:36 20-12-2016
cabron666



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

Цитата:
Реальный нет, так как не работает между таблицами. Но триггерами можно сделать.

Спасибо за ответ, не мог бы ты привести пример, как можно сделать это триггерами?
Спасибо

----------
Жизнь - это рояль, клавиша белая, клавиша черная, крышка...

Всего записей: 1342 | Зарегистр. 03-02-2002 | Отправлено: 16:39 20-12-2016
Mavrikii

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

Цитата:
бы ты привести пример, как можно сделать это триггерами

а может проще сделать, чтобы в
Цитата:
product_features_values

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

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 00:10 21-12-2016
cabron666



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
Проблема в том, что не только есть цвет, есть другие данные, как диаметр трубы, емкость в м3, номера могут повторяться, но это разные характеристики, по этому существует feature_id, variant_id и variant
 
Спасибо

----------
Жизнь - это рояль, клавиша белая, клавиша черная, крышка...

Всего записей: 1342 | Зарегистр. 03-02-2002 | Отправлено: 13:55 21-12-2016
Mavrikii

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

Цитата:
пример, как можно сделать это триггерами?  

не проверял, только для идеи
 

Код:
DELIMITER //
 
CREATE TRIGGER unique_values BEFORE INSERT ON product_features
FOR EACH ROW BEGIN
  DECLARE C INT;
  SELECT COUNT(*) INTO C FROM  
    (SELECT variant FROM product_features_values WHERE variant_id = NEW.variant_id) v,
    product_features p
  LEFT JOIN product_features_values pv ON p.variant_id = pv.variant_id
  WHERE pv.variant = v.variant AND p.product_id = NEW.product_id;
 
  IF (C > 0) THEN
    SIGNAL SQLSTATE '45000' SET message_text = 'Duplicates are not allowed';
  END IF;
END//
 
DELIMITER ;

 
аналогично на обновление, если нужно.

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 06:39 26-12-2016 | Исправлено: Mavrikii, 06:39 26-12-2016
yuris

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем. Прошу помощи в создании триггера.
Есть таблица cdr в которую вносятся тел. номера звонящих и ещё куча всего.
В поле src часть номеров заносится правильно в виде 79001234567 начиная с 7 и длиной 11 цифр, другая часть - 9001234567 без 7 впереди и длиной 10.
Хочу привести всё к единому виду типа 79001234567.
Попытался сделать триггер

Код:
 
DELIMITER ;;  
CREATE DEFINER=`asterisk`@`%` TRIGGER cdr_insert AFTER INSERT ON cdr  
FOR EACH ROW BEGIN  
DECLARE ph VARCHAR(25);  
IF CHAR_LENGTH(NEW.src) = '10' THEN  
ph = CONCAT('7',SUBSTRING(NEW.src));
END IF;  
UPDATE cdrdb.cdr SET src = ph WHERE uniqueid = NEW.uniqueid LIMIT 1;  
END;;  
DELIMITER ;
 

получил ERROR 1064 (42000): error in your SQL syntax
near '= CONCAT('7',SUBSTRING(NEW.src));
Делается всё на Server version: 5.5.56-MariaDB MariaDB Server
В правильном направлении я вообще пошел?

Всего записей: 382 | Зарегистр. 19-11-2001 | Отправлено: 16:15 04-10-2017
Mavrikii

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

Цитата:
В правильном направлении я вообще пошел?

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

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 17:39 04-10-2017
yuris

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо Mavrikii
Если изменить состояние триггера с AFTER на BEFOR INSERT то я никак не соображу как вставить новое значение. Не могли бы вы пример накидать.
 
 

Всего записей: 382 | Зарегистр. 19-11-2001 | Отправлено: 21:23 04-10-2017
Mavrikii

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

Цитата:
то я никак не соображу как вставить новое значение.

простой пример

Код:
delimiter //
CREATE TRIGGER upd_check BEFORE UPDATE ON account
    FOR EACH ROW
    BEGIN
        IF NEW.amount < 0 THEN
            SET NEW.amount = 0;
        ELSEIF NEW.amount > 100 THEN
            SET NEW.amount = 100;
        END IF;
    END;//
delimiter ;

это на обновления, аналогично на вставку
меняются значения полей полученных в запросе, а затем данные записываются базой, как если бы было и без триггера

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 21:29 04-10-2017 | Исправлено: Mavrikii, 21:33 04-10-2017
sem88

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Такой вопрос нужно сделать выборку всех одинаковых имен (они неизвестны) находящихся в post_name и вывести. Это сделано:  
   
  SELECT `post_name`, COUNT(*) AS `count` FROM `dff_posts` GROUP BY `post_name` HAVING `count` > 1  
   
  Нужно теперь переименовать все найденные например добавить -1  
   
  т.е. было  
   
  ezoton  
  ezoton  
     
  vitor  
  vitor  
   
   
  нужно получить  
  ezoton-1  
  ezoton-2  
   
  vitor-1  
  vitor-2  

Всего записей: 89 | Зарегистр. 13-04-2007 | Отправлено: 08:12 26-02-2018
Mavrikii

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

Код:
set @count := 0, @prev := '';
select name from (
select IF(@prev <> post_name, @count := 1, @count := @count + 1), @prev := post_name, CONCAT(post_name, '-', @count) name from dff_posts
where post_name IN (SELECT `post_name` FROM `dff_posts` GROUP BY `post_name` HAVING `count` > 1)
order by post_name;
)

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 08:29 26-02-2018
sem88

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо за ответ,  только почему при выполнении ругается :
 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 4

Всего записей: 89 | Зарегистр. 13-04-2007 | Отправлено: 09:07 26-02-2018
Mavrikii

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

Цитата:
только почему при выполнении ругается :

потому, что не проверял - указал направление.
 

Код:
set @count := 0, @prev := '';  
select tmp.name from (  
select IF(@prev <> dff_posts.post_name, @count := 1, @count := @count + 1), @prev := dff_posts.post_name, CONCAT(dff_posts.post_name, '-', @count) name from dff_posts,
(SELECT `post_name`, COUNT(*) AS `count` FROM `dff_posts` GROUP BY `post_name` HAVING `count` > 1) tmp2
where dff_posts.post_name = tmp2.post_name  
order by dff_posts.post_name
) tmp

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 09:16 26-02-2018
sem88

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Большое спасибо за ответ. Запрос работает на 100 %. Как теперь это дело сохранить?  Т.е. нужно теперь добавить REPLACE и переписать

Всего записей: 89 | Зарегистр. 13-04-2007 | Отправлено: 09:31 26-02-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
sem88
для этого лучше иметь столбец с primary key, по нему выбирать, а не по post_name
тогда

Код:
update table
join (все, что выше, с добавкой вывода id) jtmp on jtmp.id = table.id
set table.post_name = jtmp.name;

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 09:35 26-02-2018
sem88

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть такой столбец по называется ID
 
Добавлено:
т.е. так?
 
 
update table  
 join (set @count := 0, @prev := '';  
 select tmp.name from (  
 select IF(@prev <> dff_posts.post_name, @count := 1, @count := @count + 1), @prev := dff_posts.post_name, CONCAT(dff_posts.post_name, '-', @count) name from dff_posts,  
 (SELECT `ID`, `post_name`, COUNT(*) AS `count` FROM `dff_posts` GROUP BY `post_name` HAVING `count` > 1) tmp2  
 where dff_posts.post_name = tmp2.post_name  
 order by dff_posts.post_name  
 ) tmp) jtmp on jtmp.id = table.id  
 set table.post_name = jtmp.name;
 
 
ругается на #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table
join (set @count := 0, @prev := ''' at line 1

Всего записей: 89 | Зарегистр. 13-04-2007 | Отправлено: 09:51 26-02-2018
Mavrikii

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

Цитата:
т.е. так?

наверно же нет, раз ругается
 

Код:
update dff_posts join (set @count := 0, @prev := '';  
select tmp.id, tmp.name from (  
select dff_posts.id, IF(@prev <> dff_posts.post_name, @count := 1, @count := @count + 1), @prev := dff_posts.post_name, CONCAT(dff_posts.post_name, '-', @count) name from dff_posts,  
(SELECT `post_name`, COUNT(*) AS `count` FROM `dff_posts` GROUP BY `post_name` HAVING `count` > 1) tmp2  
where dff_posts.post_name = tmp2.post_name  
order by dff_posts.post_name  
) tmp) jtmp on jtmp.id = dff_posts.id
set dff_posts.post_name = jtmp.name;

Всего записей: 15024 | Зарегистр. 20-09-2014 | Отправлено: 20:44 26-02-2018 | Исправлено: Mavrikii, 20:44 26-02-2018
sem88

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mavrikii
спасибо, смотрю на код, вы конечно асс. Но опять что-то не нравиться :
 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'set @count := 0, @prev := ''' at line 1

Всего записей: 89 | Зарегистр. 13-04-2007 | Отправлено: 14:17 27-02-2018
Открыть новую тему     Написать ответ в эту тему

Страницы: 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