Такая странность у SELECT и UPDATE

pilot911

Новичок
Такая странность у SELECT и UPDATE

Как известно, Update - это два запроса в одном Select и Replace


Делаю два запроса c одинаковой начинкой - первый - селект:

PHP:
SELECT stock.* FROM stock

LEFT JOIN buy_stock ON stock.id = buy_stock.stock_id

LEFT JOIN fe_users ON  buy_stock.user_id = fe_users.id

а второй - апдейт


PHP:
UPDATE stock

LEFT JOIN buy_stock ON stock.id = buy_stock.stock_id

LEFT JOIN fe_users ON  buy_stock.user_id = fe_users.id

SET fe_users.money= fe_users.money + 10

Селект возвращает 3 строчки, а апдейт - обновляет одну запись всего один раз, а должен (по логике) сделать это три раза.. почему так ?
 

Gas

может по одной?
Как известно, Update - это два запроса в одном Select и Replace
нет, не так.

Селект возвращает 3 строчки, а апдейт - обновляет всего одну запись.. почему так ?
ты в первом запросе выведи значения fe_users.money и увидишь что в 2-х случаях у тебя NULL
 

pilot911

Новичок
Автор оригинала: Gas
ты в первом запросе выведи значения fe_users.money и увидишь что в 2-х случаях у тебя NULL
там связующая таблица buy_stock с полями user_id и stock_id

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

PHP:
SELECT 

fe_users.money 

FROM fe_users, stock, buy_stock

WHERE 

buy_stock.user_id = fe_users.id 

AND 

stock.id = buy_stock.stock_id

все равно выводится 3 строчки

-~{}~ 27.10.08 19:33:

Автор оригинала: findnext
зачем тебе это?
у меня есть таблица buy_stock, в которой три поля - пользователь (user_id), акция (stock_id) и количество купленных при сделке акций



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

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

не понимаю, как так может быть, ведь начинка одна и таже
 

Gas

может по одной?
findnext
структура таблиц тут ясна

pilot911
Теперь понятно, лучше б сразу словами написал, так как твоё пониманием механизма не совсем верно.

Щас напишу какой-нить запросик.
 

findnext

Новичок
update Table1 t1
join Table2 t2 on t1.ID=t2.t1ID
join Table3 t3 on t2.ID=t3.t2ID
set t1.Value=12345
where t3.ID=54321
 

Gas

может по одной?
Код:
UPDATE 
(
  SELECT u.id, COUNT(*) AS cnt
  FROM fe_users AS u
  JOIN buy_stock AS bs ON u.id=bs.user_id
  JOIN stock AS s ON s.id=bs.stock_id
  GROUP BY u.id
) AS tmp 
JOIN fe_users AS u2 ON tmp.id = u2.id
SET u2.money = u2.money + (`дзеньги за одну акцию`) * tmp.cnt;
как-то так
 

pilot911

Новичок
всем большое спасибо и двойное спасибо Gas :)


пока сделал такой запрос (не уверен, что он будет эффективно отрабатываться на паре сотен тысяч сделок):


PHP:
      	UPDATE  (
      		SELECT id, SUM(cnt) as cnt_ FROM (
				(
			  		SELECT u.id as id, SUM(bs.stock_rest)*s.current_price as cnt
			  		FROM fe_users AS u
			 		 JOIN buy_stock AS bs ON u.id=bs.user_id
			 		 JOIN stock AS s ON s.id=bs.stock_id
			 		 GROUP BY bs.stock_id
				) AS tmp
      			)  
		)	AS tmp_
		JOIN fe_users AS u2 ON tmp_.id = u2.id
		SET u2.money = u2.money + tmp_.cnt_;
 
Сверху