Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Из трех полей выбрать ненулевое
 
 автор: Лена   (02.02.2010 в 23:13)   письмо автору
 
 

В таблице 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());

  Ответить  
 
 автор: Trianon   (02.02.2010 в 23:27)   письмо автору
 
   для: Лена   (02.02.2010 в 23:13)
 

COALESCE(priority1, priority2, ... , priorityN )

  Ответить  
 
 автор: Лена   (02.02.2010 в 23:51)   письмо автору
 
   для: Trianon   (02.02.2010 в 23:27)
 

Не выходит.
SELECT name, COALESCE( Price, Price_grv, Price_euro ) , product_code
FROM SS_products
Там, где грв. и евро не возвращается.
Тип поля - float, и по умолчанию - 0, а не NULL.
И потом мне надо узнать, из какого именно поля мы вытянули цену.
Потому что к результату потом применяются разные функции в зависимости от того, из какого поля нужно было выбрать.
Наверное, три запроса надо делать.

  Ответить  
 
 автор: Trianon   (03.02.2010 в 00:19)   письмо автору
 
   для: Лена   (02.02.2010 в 23:51)
 

0 значит цена 0 рублей долларов евро и т.д.
а вовсе не "не указана"
Не указана - значит NULL .

Запроса надо делать не три, а один. Максимум - два.
ALTER TABLE и UPDATE TABLE.

  Ответить  
 
 автор: Лена   (04.02.2010 в 00:22)   письмо автору
 
   для: 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), плюс надо отдельно посчитать общую сумму по гривне и по долларам. В таблице три поля - для гривны, доллара и евро. Одно из полей заполнено.

  Ответить  
 
 автор: Trianon   (04.02.2010 в 01:24)   письмо автору
 
   для: Лена   (04.02.2010 в 00:22)
 

[ грустно так посмотрел... ]

  Ответить  
 
 автор: Лена   (05.02.2010 в 13:07)   письмо автору
 
   для: 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], -33) == '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], -33) == 'EUR'){
        
//аналогично гривне, только результат обрабатывается show_price_euro();
        
}elseif(mb_substr($r[1], -33) == 'USD'){
        
//аналогично гривне, только результат обрабатывается show_price();
        
}
    }
?>

  Ответить  
 
 автор: heed   (03.02.2010 в 00:21)   письмо автору
 
   для: Лена   (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, но я не пришёл пока к выводу в каком-же формате удобнее хранить ,) выбирал между текстом и двумя полями (для рублей/копеек например)

  Ответить  
 
 автор: Trianon   (03.02.2010 в 00:45)   письмо автору
 
   для: heed   (03.02.2010 в 00:21)
 

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

За GREATEST() спасибо.
Вне связи с.

Цену в руб-коп хранить надо либо в DECIVAL(9,2) (неэкономично, гламурно)
либо в INT/BIGINT - прямо в копейках. (дешево, но брутально)

  Ответить  
 
 автор: psychomc   (04.02.2010 в 10:10)   письмо автору
 
   для: Trianon   (03.02.2010 в 00:45)
 

изначально непонятно зачем здесь под каждую валюту отдельное поле...

  Ответить  
 
 автор: Trianon   (04.02.2010 в 10:18)   письмо автору
 
   для: psychomc   (04.02.2010 в 10:10)
 

Это я как раз могу объяснить.
Если один товар идет от разных поставщиков, с разными методиками ценообразования, то почему бы и нет.

  Ответить  
 
 автор: psychomc   (04.02.2010 в 11:55)   письмо автору
 
   для: Trianon   (04.02.2010 в 10:18)
 

да, всё правильно, об этом я не подумал... (была подобная задача, делал товары с ценой в у.е и валюты с курсами перевода, задача позволяла)

теперь уже здесь непонятно, почему нельзя одним запросом выбрать 3 цены и проверить c помощью empty

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования