Обновление записей для каждого подписчика

usascha

Новичок
Обновление записей для каждого подписчика

Всем здрасте!
Подскажите как правильно сформировать запрос на обновление записей в базе.

Сейчас успешно выбираю из базы все подписки, оформленные для одного подписчика, следующим образом:

PHP:
$query = "SELECT *
			FROM subscriber s, publication p
				LEFT JOIN list l ON s.id = l.subscriber_id
					AND p.p_id = l.publication_id
			WHERE s.id = ".$_GET['subscriber_id']."
			GROUP BY p.p_id
			ORDER BY l.publication_amount DESC";
Выборка работает и все бы замечательно, да вот никак не придумаю как сохранить сделанные изменения.

Сейчас структура базы нормализована и есть таблицы: subscriber - все данные по подписчику, publication - названия и пр. инфа о журналах, list - индексная таблица, где сведены из этих двух таблиц: количество подписок на каждый журнал для каждого подписчика.

ТЕПЕРЬ У МЕНЯ ВОЗНИК ВОПРОС: Выбирая из базы данные, я получаю два типа данных - есть подписка и соответствий нет.

Как обновить запись уже имеющуюся в талице list (чтобы не создавать новую) и как добавить новую подписку для подписчика, у которого уже есть подписки?

Добавлю, что структура таблицы list следующая:
CREATE TABLE `list` (
`l_id` int(5) NOT NULL auto_increment,
`subscriber_id` char(5) NOT NULL default '0',
`publication_id` tinyint(4) default '0',
`publication_amount` int(4) default '0',
PRIMARY KEY (`l_id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1094 ;
 

usascha

Новичок
zerkms,
я, конечно, не утверждаю, что много знаю, но Вы не поверите - эти запросы к базе мне знакомы.

Понятно, что этими запросами надо пользоваться. Как это сделать, при отправке таких разных данных из одной таблицы?
Это возможно сделать одним запросом UPDATE? Где-то мне попадалась инфа, что этот запрос может и добавлять данные в базу.
 

ybilevych

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

usascha

Новичок
ybilevych,
для внесения изменений данных о подписке они открываются в человеческом виде в форме, которая потом и сабмитится.
Так вот данные этой формы и различаются:
1. уже имеющаяся подписка
2. вновь оформленная подписка.

другими словами:

`l_id` - это auto_increment,
`subscriber_id` - это foreign key из таблицы о подписчиках. Это значение может быть в таблице List, а может и не быть в комбинации со следующим значением,
`publication_id` - это foreign key из таблицы об изданиях, которого тоже может не быть в сочетании с предыдущим и следующим параметрами,
`publication_amount` - количество подписок на издание с номером publication_id.

Поскольку все данные отдаются скрипту одновременно, то как сделать желательно один запрос на обновление имеющихся данных и внесение новых?
 

ybilevych

Новичок
Поскольку все данные отдаются скрипту одновременно,
Это не имеет никакого отношения к количеству запросов в скрипте.
Предлагаю не выдумывать велосипед, а сделать отдельным запросом создание новой/обновление каждой записи.
Определять, существует ли запись, можно по наличию `l_id`, который передается в форму в хидден поле. Если существует, то UPDATE; если нет, то INSERT.
Кстати, поля `subscriber_id` и `publication_id`не должны быть пустыми, иначе запись в таблице не имеет смысла.
 

usascha

Новичок
Если других вариантов не придумано цивилизацией, то - окей, я так и буду делать. Это мне по силам.
Правда, пока не очень понимаю как разделить эти признаки: существует и не существует.

Кстати, поля `subscriber_id` и `publication_id`не должны быть пустыми, иначе запись в таблице не имеет смысла.
Что имеется ввиду? В таблице list или в таблице результатов выборки?

-~{}~ 23.06.06 17:29:

Автор оригинала: Rvm
А знаком

REPLACE ... SELECT?
С таким вариантов вложенного запроса знаком, но только теоретически. Не затруднит подсобить вариант запроса дать, чтобы я мог по аналогии свой смастерить?
 

usascha

Новичок
так, вроде бы, и не ноль эти значения!

Сейчас ломаю готову над правильным запросом на вставку данных.

Пытаюсь осознать два варианта:
INSERT INTO list VALUES (...,...,...), (...,...,...)

или

REPLACE INTO list VALUES (...,...,...), (...,...,...)
 

ybilevych

Новичок
Ну можешь и через REPLACE...
В список полей включаешь `l_id`, а его значение в запросе ставишь NULL для ной зависи или соответствующее для существующей

REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new row for a PRIMARY KEY or a UNIQUE index, the old row is deleted before the new row is inserted.
(c) refman-4.1-en
 
Сверху