LINUX.ORG.RU

замещение значений таблицы mysql

 ,


0

1

есть таблица a вида:

+-----+------+------------+
| id | cost | route |
+-----+------+------------+
| 621 | 3.26 | texpremium |
+-----+------+------------+
| 622 | 4.11 | texpremium |
+-----+------+------------+
есть таблица b вида:
+-----+------+--------+
| id | cost | route |
+-----+------+--------+
| 621 | 2.21 | texcli |
+-----+------+--------+


нужно заместить значения из таблицы a значениями из таблицы b при совпадающем id, либо на уровне БД, либо на уровне клиентского приложения (на php).
помогите придумать логику, либо скажите куда гуглить :3

★★★★★

Последнее исправление: snoopcat (всего исправлений: 3)

Если бы было одно значимое поле, можно было бы написать типа select ifnull((select b.cost from b where id=?),a.cost) from a where id=?

Но тут два поля.

amomymous ★★★
()
Ответ на: комментарий от snoopcat
SELECT
  a.id AS id,
  IF(d.id is null, a.cost, d.cost) AS cost,
  IF(d.id is null, a.route, d.route) AS route
FROM a left join 
(SELECT
  b.id AS id,
  IF(c.id is null, b.cost, c.cost) AS cost,
  IF(c.id is null, b.route, c.route) AS route
FROM b left join c using(id)) d using(id)
ziemin ★★
()
Ответ на: комментарий от goingUp

сложно будет сгенерировать такой запрос, имхо..
тогда обойдусь одной таблицей. спасибо:)

финальный вариант запроса, если кому интересно -

SELECT
 tariff_default.id AS id, 
 IFNULL(tariff_cli.cost, tariff_default.cost) AS cost, 
 IFNULL(tariff_cli.route, tariff_default.route) AS route 
FROM 
 tariff_default LEFT JOIN tariff_cli USING(id);

snoopcat ★★★★★
() автор топика
Ответ на: комментарий от goingUp

ну суть в том, что a - тарифная сетка, а b, c.. - тарифные опции, которые должны «заменять» значения из дефолтной тарифной сетки.
нужно составить запрос для вывода «окончательных» тарифов с учётом всех активных тарифных опций

snoopcat ★★★★★
() автор топика
Последнее исправление: snoopcat (всего исправлений: 1)
Ответ на: комментарий от snoopcat

Ага. Согласно 3 нормальной формы, нужно сделать одну таблицу, которая содержит записи из всех этих и поле «тарифная опция», и выбирать из нее одну запись с таким order by, чтобы нужная запись оказалась сверху.

goingUp ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.