|
|
|
| В таблице 3 поля: Price,Price_grv,Price_euro - цена в долларах, гривне, евро. Одно из полей - заполнено, два других - пустые.
Как мне составить запрос(запросы), чтобы из этих трех полей выбиралось только то поле, в котором стоит цена?
Запрос для долларовой цены выглядит так:
$q = db_query("SELECT name, Price, product_code FROM " . PRODUCTS_TABLE . " WHERE productID='".$_SESSION["gids"][$i]."'") or die (db_error()); | |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 23:13)
| | COALESCE(priority1, priority2, ... , priorityN ) | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2010 в 23:27)
| | Не выходит.
SELECT name, COALESCE( Price, Price_grv, Price_euro ) , product_code
FROM SS_products
Там, где грв. и евро не возвращается.
Тип поля - float, и по умолчанию - 0, а не NULL.
И потом мне надо узнать, из какого именно поля мы вытянули цену.
Потому что к результату потом применяются разные функции в зависимости от того, из какого поля нужно было выбрать.
Наверное, три запроса надо делать. | |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 23:51)
| | 0 значит цена 0 рублей долларов евро и т.д.
а вовсе не "не указана"
Не указана - значит NULL .
Запроса надо делать не три, а один. Максимум - два.
ALTER TABLE и UPDATE TABLE. | |
|
|
|
|
|
|
|
для: Trianon
(03.02.2010 в 00:19)
| | Когда я говорила три запроса, я имела ввиду вот это:
<?php
$q = db_query("SELECT name, Price, product_code
FROM " . PRODUCTS_TABLE . " WHERE productID='".$_SESSION["gids"][$i]."'") or die (db_error());
if(mysql_num_rows > 0){
if ($r = db_fetch_row($q))
show_price($r[1]);
}else{
$q1 = db_query("SELECT name, Price_grv, product_code
FROM " . PRODUCTS_TABLE . " WHERE productID='".$_SESSION["gids"][$i]."'") or die (db_error());
if(mysql_num_rows > 0){
if ($r1 = db_fetch_row($q1))
show_price_grv($r1[1]);
}else{
$q2 = db_query("SELECT name, Price_euro, product_code
FROM " . PRODUCTS_TABLE . " WHERE productID='".$_SESSION["gids"][$i]."'") or die (db_error());
if(mysql_num_rows > 0){
if ($r2 = db_fetch_row($q2))
show_price_euro($r2[1]);
}
}
}
?>
|
Это упрощенный код. Смысл такой. Допустим, пользователь выбирает 2 товара в гривнях и 2 товара в долларах. Надо сначала вывести на страницу отформатированную цену( функции show_price, show_price_euro), плюс надо отдельно посчитать общую сумму по гривне и по долларам. В таблице три поля - для гривны, доллара и евро. Одно из полей заполнено. | |
|
|
|
|
|
|
|
для: Лена
(04.02.2010 в 00:22)
| | [ грустно так посмотрел... ] | |
|
|
|
|
|
|
|
для: Trianon
(04.02.2010 в 01:24)
| | Сделала, как Вы и советовали, получилось. Спасибо.
Привожу кусок кода:
<?php
$q = "SELECT name,COALESCE(CONCAT(Price, '_USD'),
CONCAT(Price_euro, '_EUR'),
CONCAT(Price_grv, '_UAH')) AS 'sale_price', product_code
FROM " . PRODUCTS_TABLE . " WHERE productID=".$_SESSION["gids"][$i];
$res = db_query($q) or die (db_error());
if ($r = db_fetch_row($res)){
if(mb_substr($r[1], -3, 3) == 'UAH'){
$rsub = mb_substr($r[1],0,-4);
$uan = $_SESSION["counts"][$i]*$rsub;
$tmp = array("id"=>$_SESSION["gids"][$i], "name"=>$r[0], "quantity"=>$_SESSION["counts"][$i], "cost"=>show_price_grv($uan), "product_code"=>$r[2]);
//далее остальной код, отправка данных в шаблон
}elseif(mb_substr($r[1], -3, 3) == 'EUR'){
//аналогично гривне, только результат обрабатывается show_price_euro();
}elseif(mb_substr($r[1], -3, 3) == 'USD'){
//аналогично гривне, только результат обрабатывается show_price();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(02.02.2010 в 23:51)
| | тогда можно попробовать выбирать большее из значений
незнаю насколько там оптимизировано сравнение, но нашёл непосредственно рядом с COALESCE :)
GREATEST(value1,value2,...)
With two or more arguments, returns the largest (maximum-valued) argument. The arguments are compared using the same rules as for LEAST().
mysql> SELECT GREATEST(2,0);
-> 2
mysql> SELECT GREATEST(34.0,3.0,5.0,767.0);
-> 767.0
mysql> SELECT GREATEST('B','A','C');
-> 'C'
|
GREATEST() returns NULL if any argument is NULL.
// только мне непонятно по каким признакам собираетесь отличать вернул-ли запрос результат из одного поля или из другого.
Наверное для такого придётся выбирать всё , анализируя в скрипте, или ещё больше усложнять запрос.
И говорят возможно немного неточностей при хранении цен в float, но я не пришёл пока к выводу в каком-же формате удобнее хранить ,) выбирал между текстом и двумя полями (для рублей/копеек например) | |
|
|
|
|
|
|
|
для: heed
(03.02.2010 в 00:21)
| | Конечно... надо развернуть исследование сравнительной эффективности методик применения криво забитых гвоздей для удерживания картины на стене. Вместо того, чтоб криво забитый гвоздь выдернуть, забить ровно и о проблеме забыть.
За GREATEST() спасибо.
Вне связи с.
Цену в руб-коп хранить надо либо в DECIVAL(9,2) (неэкономично, гламурно)
либо в INT/BIGINT - прямо в копейках. (дешево, но брутально) | |
|
|
|
|
|
|
|
для: Trianon
(03.02.2010 в 00:45)
| | изначально непонятно зачем здесь под каждую валюту отдельное поле... | |
|
|
|
|
|
|
|
для: psychomc
(04.02.2010 в 10:10)
| | Это я как раз могу объяснить.
Если один товар идет от разных поставщиков, с разными методиками ценообразования, то почему бы и нет. | |
|
|
|
|
|
|
|
для: Trianon
(04.02.2010 в 10:18)
| | да, всё правильно, об этом я не подумал... (была подобная задача, делал товары с ценой в у.е и валюты с курсами перевода, задача позволяла)
теперь уже здесь непонятно, почему нельзя одним запросом выбрать 3 цены и проверить c помощью empty | |
|
|
|