Форум программистов, компьютерный форум, киберфорум
MySQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/29: Рейтинг темы: голосов - 29, средняя оценка - 4.90
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308

Нужно составить запрос на удаление строк по id

09.11.2017, 12:16. Показов 6312. Ответов 12

Студворк — интернет-сервис помощи студентам
Всем привет.

У меня такая проблема: не могу грамотно составить SQL-запрос.

Допустим, я на сайте помечаю статьи кнопкой, и они таким образом попадают в избранное, с добавлением id статьи.

Конкретнее:
Таблица users содержит например:
столбец user_id (тип int(11)), например user_id = "1"
столбец favorites (тип text), например favorites = "46,53,64,65,73,22,88,94,8,26,106,12 "
и другие ненужные нам стобцы.

Таблица post содержит например:
столбец id (тип int(11)), например id = "46"

Так вот, когда я нажимаю кнопочку, в favorites добавляется id статьи, через запятую.
Теперь главный вопрос.
Как мне удалить из таблицы post все записи, id который равен тем, которые перечислены в favorites, и обязательно только у user_id = "1".
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2017, 12:16
Ответы с готовыми решениями:

Сложный запрос на удаление дублирующихся строк
Имеется такой запрос (где id - уникальный ключ и автоинкремент) : DELETE FROM `myTable` WHERE `id` IN (SELECT * FROM (SELECT `id` FROM...

Запрос на удаление строк из двух таблиц
Возможно ли написать запрос на удаление строк из 2х таблиц, по полю значение которого, совпадает со значением выбранным в 3ей...

Составить SQL-запрос на удаление данных
Доброго времени суток. Прошу помощи в составлении sql-запросов. На добавление я сделал - работает нормально, удаление я сделал - не...

12
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
09.11.2017, 13:13
Цитата Сообщение от Рафик Посмотреть сообщение
которые перечислены в favorites, и обязательно только у user_id = "1"
Действуй по шагам. Сначала составь запрос (SELECT), который реализует выделенное мной
1
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308
09.11.2017, 13:35  [ТС]
SQL
1
SELECT favorites FROM `users` WHERE user_id = 1
Выводит мне favorites юзера 1.

А дальше что?
Как мне удалить из таблицы users эти id из favorites?

Добавлено через 11 минут
Как эти id, которые идут одним полем через запятую мне разбить на отдельные значения и потом каким-то образом перебором их удалять?

Или что, можно просто написать вот так:
SQL
1
2
DELETE * FROM post WHERE id = $favorites
//$favorites = "46,53,64,65,73,22,88,94,8,26,106,12"
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
09.11.2017, 15:41
Цитата Сообщение от Рафик Посмотреть сообщение
Как эти id, которые идут одним полем через запятую мне разбить на отдельные значения
С точки зрения реляционных БД правильнее их записывать не в строку, а в таблицу (каждое значение в отдельную строку).
Тогда нет проблем с запросом
SQL
1
2
3
4
5
6
DELETE
FROM tab1
WHERE id IN
  (SELECT id
   FROM tab2
  )
1
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308
09.11.2017, 15:45  [ТС]
Цитата Сообщение от Grossmeister Посмотреть сообщение
С точки зрения реляционных БД правильнее их записывать не в строку, а в таблицу (каждое значение в отдельную строку).
Я не спорю, что так как говорите вы, было бы правильнее, но увы.
Я не могу изменять структуру записи в таблицу. Мне нужно работать с тем, что есть.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
09.11.2017, 16:00
Цитата Сообщение от Рафик
Мне нужно работать с тем, что есть
Конструкция IN не предназначена для работы со строками, которые содержат список. Список должен быть явно прописан в запросе, либо выбираться с пом. SELECT.

Можно с пом. какой-то функции (скорее всего самописной) распарсить строку, записать каждое значение в строку таблицы и далее см. выше. Можно еще почитать про работу с JSON, но тут я помочь не смогу - дела не имел.
1
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308
09.11.2017, 16:18  [ТС]
Скорее всего в итоге у меня должен получиться php файл, запуская который, должна выполняться эта функция удаления.
Можно как-то распарсить эту строку, внеси все значения в массив и циклом выполнить sql запросы.
Но не умею.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
09.11.2017, 17:12
Цитата Сообщение от Рафик Посмотреть сообщение
Можно как-то распарсить эту строку
функции работы со строками
https://dev.mysql.com/doc/refm... tions.html
1
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308
10.11.2017, 05:21  [ТС]
Кидать ссылку на мануал не лучший способ помочь новичку. Ещё и на английском. Я конечно приобрету бесценный опыт, но потеряю очень много времени, пока найду и разберусь там именно то, что нужно, отсеивая лишнее.

Возможно придётся спрашивать в другом разделе, уже по PHP, или заказывать у фрилансеров готовое решение. В любом случае, спасибо за помощь.
0
4217 / 3059 / 583
Регистрация: 21.01.2011
Сообщений: 13,203
10.11.2017, 09:56
Цитата Сообщение от Рафик Посмотреть сообщение
Кидать ссылку на мануал не лучший способ помочь новичку
Как раз выкладывать готовый текст процедуры - не лучший способ помочь новичку.
Это из серии "Что лучше - дать голодному рыбу или научить его эту рыбу ловить".

А по поводу английского - либо его придется учить, либо не иметь никакого отношения к ИТ.
1
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308
10.11.2017, 11:06  [ТС]
А я и не говорил, что не знаю английского. Могу говорить без словаря, но техническую литературу для лучшего понимания удобнее читать на родном.

Давайте не будем устраивать холивар. Я не просил вас всё сделать за меня. И сравнение про рыбу тоже не совсем корректное. В данном случае вы не пытаетесь научить меня ловить рыбу, а говорите: "в магазине есть удочка, в земле черви, а за деревней озеро".

Не поймите меня неправильно, с уважением к вам отношусь, но зачем нужен форум, если не подсказывать правильные пути решения задач и наставлять новичков. Вы же видите, я пытаюсь что-то сделать, сам ищу алгоритмы, но навыков не хватает.

p.s. Пожалуй тему можно закрывать.
0
128 / 126 / 60
Регистрация: 22.01.2014
Сообщений: 464
10.11.2017, 17:02
Лучший ответ Сообщение было отмечено Рафик как решение

Решение

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
class DeleteIds
{
    public $connect;
    public $state;
    public $db_name;
    public $sql_user,$sql_password;
    public $host;
    public $dbg;
    public $lastError;
 
    function DeleteIds(){
        $this->connect=false;
        $this->state=null;
        $this->db_name='test';
        $this->sql_user='user';
        $this->sql_password='password';
        $this->host='localhost';
        $this->dbg=true;
        $this->lastError='';
    }
    
    function connect(){
        $this->connect=mysql_connect($this->host,$this->sql_user,$this->sql_password);
        return $this->connect;  
    }
    
    function select_db($db_name=null){
        $name=$this->db_name;
        if ($db_name!=null){
            $name=$db_name;
        }
        $db=mysql_select_db($this->db_name,$this->connect);
        if ($db==false){
            print '<br>Error select db!'.$this->db_name;
        }
        return $db;
    }
    
    
    function delete_ids(){
        $query='select favorites from users where user_id = 1';
        $qret=$this->save_query($query);
        if ($qret==false) 
            return false;
        $num=mysql_num_rows($qret);
        if ($num<=0) {
            print '<br>Table is empty!';
            return 0;
        }
        $s='';
        $hi=$num-1;
        for ($i=0;$i<$num;$i++){
            $ids=mysql_result($qret,$i,'favorites');
            $s=$s.$ids;
            if ($i!=$hi){
                $s=$s.',';
            }
        }
        $arr=explode(',',$s);
        $count=0;
        foreach ($arr as $id){
            $id=trim($id);
            if (strlen($id)==0)
                continue;
            $query="delete from post where id = $id";
            print "try to delete id:$id <br>\n";
            $qret=$this->save_query($query);
            if ($qret){
                $count+=1;
            }
        }
        return $count;
    }
    
    function close(){
        if ($this->connect!=false){
            mysql_close($this->connect);
        }
    }
    
    function save_query($s){
        $qret=mysql_query($s,$this->connect);
        if ($qret==false) {
            $this->lastError=mysql_error();
            if ($this->dbg){
                print "\n".'<BR>error sql:'.$s.' er_msg:'.$this->lastError;
            }
            return false;
        }else
            return $qret;
    }
};
 
$d= new DeleteIds();
if ($d->connect()){
    if ($d->select_db()){
        $ret=$d->delete_ids();
        if ($ret === false ){
            print "Error!".$d->lastError;
        }else
            print "OK deleted, count:$ret";
    }else
        print "Unable to select_db!";
    $d->close();
}else
    print "Unable to connect to DB!";
Думаю, где-то так.
1
2 / 2 / 1
Регистрация: 25.06.2013
Сообщений: 308
10.11.2017, 18:21  [ТС]
nikolay1982, спасибо огромное. Всё работает идеально. Вы сэкономили мне очень много времени и нервов.
Мне останется только очистить список favorites у юзера, но с этим уже думаю что справлюсь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.11.2017, 18:21
Помогаю со студенческими работами здесь

Нужно сделать запрос на удаление просрочки
помогите!нужно сделать запрос на удаление просрочки!в делфи,у меня есть всплывающее окно с просрочкой нужно теперь ее удалить

Запрос на удаление строк входящих в другую таблицу
Доброго времени суток. Подскажите с диалектом птицы, есть две таблицы, с первой выбираются distinct одного из полей(пусть Х) за...

нужно составить запрос
нужно составить запрос Есть 3 таблицы первая - список товаров - product product.product_id product.product_name вторая -...

Нужно составить запрос
Есть таблица soldItems, там есть поле itemId Есть таблица items, там есть поле id (=itemId) и seller нужно взять COUNT(*), используя...

нужно составить запрос
Ребята, всем привет. Нужна ваша помощь. Имеется следующая таблица School: Teacher | Class t1 | A | t1 | ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru