Запрос mysql выбрать строки где в любом из полей со словом "zena" значение>0 , как?

P
На сайте с 06.01.2009
Offline
601
789

Здравствуйте.

Подскажите, пожалуйста.

Есть таблица, в ней есть поля ord_zena, kro_zena, pro_zena и т.д.

Можно ли одним запросом выбрать строки, где в любом из этих полей значение больше 0 ?


$result = mysql_query("SELECT `id`, `ord_zena`, `kro_zena`, `pro_zena` FROM `table5` WHERE `любое_из_полей_с_zena`>'0'");

Спасибо

W
На сайте с 09.04.2013
Offline
46
#1


SELECT table5.id,table5.ord_zena,table5.kro_zena,table5.pro_zena FROM table5
WHERE ord_zena>0 OR kro_zena>0 OR pro_zena>0
P
На сайте с 06.01.2009
Offline
601
#2
webjey:

SELECT table5.id,table5.ord_zena,table5.kro_zena,table5.pro_zena FROM table5
WHERE ord_zena>0 OR kro_zena>0 OR pro_zena>0

Понял, спасибо. Т.е. их перечислять в любом случае надо...

а, не подскажете, почему так как у вас, а не так


SELECT id, ord_zena, kro_zena, pro_zena FROM table5 WHERE ord_zena>0 OR kro_zena>0 OR pro_zena>0

какова цель приписывать table5.?

W
На сайте с 09.04.2013
Offline
46
#3

Это для непосредственного обращения к таблице.Например у нас есть другая таблица (table6),с тем же наименованием полей ord_zena,kro_zena ...

Тогда можно выполнить такой запрос

SELECT table5.id,table5.ord_zena,table5.kro_zena,table5.pro_zena,

table6.pro_zena as t6zena FROM table6 ,table5
WHERE table5.pro_zena >0

В данном случае можно обойтись без этого.

Чтобы увидеть все колонки с "zena" можно выполнить запрос:

SHOW COLUMNS FROM table5 LIKE "%zena%"

Набросал php прототип чтобы не перечислять,но тут 2 запроса:


<?php
$host="localhost";
$db="";
$charset="utf8";
$user="";
$pass="";

$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$opt = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
try {
$pdo = new PDO($dsn, $user, $pass, $opt);
} catch (PDOException $e) {
die('Подключение не удалось: ' . $e->getMessage());
}

$data = $pdo->query('SHOW COLUMNS FROM table5 LIKE "%zena%"')->fetchAll(PDO::FETCH_COLUMN);
$zena='SELECT id, ord_zena, kro_zena, pro_zena FROM table5 WHERE ';
foreach ($data as $param){
$or='OR ';
if ($param === end($data)){
$or='';
}
$zena.=sprintf("%s > 0 %s",$param ,$or);
}
$stmt = $pdo->query($zena)->fetchAll();
echo $zena.PHP_EOL;
print_r($stmt);

Возможно есть более изящное решение.

P
На сайте с 06.01.2009
Offline
601
#4

Друзья, привет. Подскажите, нет ли решения, упростить выборку товаров?

Повторюсь, есть таблица, в ней несколько полей наименование которых содержит слово "_zena".

Задача.

1. выбрать все товары, где только одно из полей со словом "_zena" имеет значение>0

2. второй заход. сделать выборку товаров где более одного поля со словом "_zena" имеет значение >0

в обоих случаях нужно получить непосредственно что это за поле и его значение.

Спасибо заранее.

edogs software
На сайте с 15.12.2005
Offline
775
#5

postavkin,

1) А куда еще проще-то? Чем Вам сложен уже подсказанный вариант?

2) Тут условие можно как-то так задать (if(kro_zena>0,1,0)+if(ord_zena>0,1,0)+if(pro_zena>0,1,0))>1

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
W
На сайте с 09.04.2013
Offline
46
#6

postavkin,кажется, я понял что вы хотите сделать.

Создаем таблицу со всеми возможными значениями "zena"


CREATE TABLE `zena_status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ord_zena` tinyint(1) DEFAULT NULL,
`kro_zena` tinyint(1) DEFAULT NULL,
`pro_zena` tinyint(1) DEFAULT NULL,
`text` varchar(255) DEFAULT NULL,
UNIQUE KEY `un` (`ord_zena`,`kro_zena`,`pro_zena`),
KEY `id` (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

INSERT INTO `zena_status` VALUES ('1', '0', '0', '0', null);
INSERT INTO `zena_status` VALUES ('2', '1', '0', '0', 'ord_zena');
INSERT INTO `zena_status` VALUES ('3', '0', '1', '0', 'kro_zena');
INSERT INTO `zena_status` VALUES ('4', '0', '0', '1', 'pro_zena');
INSERT INTO `zena_status` VALUES ('5', '1', '1', '0', 'ord_zena,kro_zena');
INSERT INTO `zena_status` VALUES ('6', '0', '1', '1', 'kro_zena,pro_zena');
INSERT INTO `zena_status` VALUES ('7', '1', '0', '1', 'ord_zena,pro_zena');
INSERT INTO `zena_status` VALUES ('8', '1', '1', '1', 'ord_zena,kro_zena,pro_zena');

Создаем таблицу c товарами


CREATE TABLE `tovar` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`tovar` varchar(255) DEFAULT NULL,
`zena_status` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `id` (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

INSERT INTO `tovar` VALUES ('1', 'asd', '1');
INSERT INTO `tovar` VALUES ('2', 'fsdf', '2');
INSERT INTO `tovar` VALUES ('3', 'zcbsts', '3');
INSERT INTO `tovar` VALUES ('4', 'vzcvzcv', '4');
INSERT INTO `tovar` VALUES ('5', 'hryeth', '5');
INSERT INTO `tovar` VALUES ('6', 'xhsdfg', '6');
INSERT INTO `tovar` VALUES ('7', 'afadf', '7');
INSERT INTO `tovar` VALUES ('8', 'asdasfadf', '8');

Теперь все просто:

1. выбрать все товары, где только одно из полей со словом "_zena" имеет значение>0


SELECT * FROM `tovar` where zena_status in (2,3,4);

2. второй заход. сделать выборку товаров где более одного поля со словом "_zena" имеет значение >0


SELECT * FROM `tovar` where zena_status in (5,6,7,8);

3.Можно ли одним запросом выбрать строки, где в любом из этих полей значение больше 0 ?


SELECT * FROM `tovar` where zena_status in (2,3,4,5,6,7,8);

4.в обоих случаях нужно получить непосредственно что это за поле и его значение.

Для удобства в zena_status добавленно поле "text" - поля >1

5.При добавлении в таблицу tovar выбираем опции "zena"


SELECT id FROM `zena_status` WHERE kro_zena=1 and pro_zena=0 and ord_zena=0;

Потом insert с полученным id.

edogs software
На сайте с 15.12.2005
Offline
775
#7
webjey:
postavkin,кажется, я понял что вы хотите сделать.

Создаем таблицу со всеми возможными значениями "zena"

CREATE TABLE `zena_status` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ord_zena` tinyint(1) DEFAULT NULL,
`kro_zena` tinyint(1) DEFAULT NULL,
`pro_zena` tinyint(1) DEFAULT NULL,
`text` varchar(255) DEFAULT NULL,
UNIQUE KEY `un` (`ord_zena`,`kro_zena`,`pro_zena`),
KEY `id` (`id`) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

INSERT INTO `zena_status` VALUES ('1', '0', '0', '0', null);
INSERT INTO `zena_status` VALUES ('2', '1', '0', '0', 'ord_zena');
INSERT INTO `zena_status` VALUES ('3', '0', '1', '0', 'kro_zena');
INSERT INTO `zena_status` VALUES ('4', '0', '0', '1', 'pro_zena');
INSERT INTO `zena_status` VALUES ('5', '1', '1', '0', 'ord_zena,kro_zena');
INSERT INTO `zena_status` VALUES ('6', '0', '1', '1', 'kro_zena,pro_zena');
INSERT INTO `zena_status` VALUES ('7', '1', '0', '1', 'ord_zena,pro_zena');
INSERT INTO `zena_status` VALUES ('8', '1', '1', '1', 'ord_zena,kro_zena,pro_zena');

Хотели бы мы посмотреть на эту же таблицу, когда у ТС будет 16 разных цен. Это ж ппц. Да еще апдейтить это постоянно.

Нене. Так нельзя делать.

Если уж менять структуру, то разумнее сделать таблицу (item_id, price_type, price_value)

где в item_id положить ИД товара, в price_type тип цены (ord, kro, pro) и в price_value непосредственно значение цены. Потом по ней делать выборки уже с группировками и фильтрами.

Но особого смысла в этом при небольшой базе нет.

W
На сайте с 09.04.2013
Offline
46
#8
edogs:
Хотели бы мы посмотреть на эту же таблицу, когда у ТС будет 16 разных цен. Это ж ппц. Да еще апдейтить это постоянно.
Нене. Так нельзя делать.

Да тупанул.Я забил себе голову,что у него там 0 и 1 типа опции.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий