Къде бъркам във заявката си?

A

Anonymous

Guest
Здравейте, вече няколко часа опитвам да направя нещо и все удрям на камък. Искам да направя advanced search търсачка, която да търси по много критерии. Аз PHP-то мога да го направя, обаче имам проблем със SQL кода. Ето какво съм направил аз:

Код:
SELECT * FROM `ads_parts`WHERE `year`>="1960" AND `year`<="2011" AND `marka`="3" AND `price`>="500" AND `price`<="2000" AND `region`="3" ORDER BY `date`

Проблемът в момента е че има резултати отговарящи на този критерии но този sql код не работи (не дава грешка просто е грешен) Много ще съм Ви благодарен ако ме насочите или помогнете. (давам точка разбира се)
 
[sql]SELECT * FROM `ads_parts`WHERE (`year`>='1960' AND `year`<='2011' AND `marka`='3' AND `price`>='500' AND `price`<='2000' AND `region`='3') ORDER BY `date`[/sql]try this
 
Advanced search ... струва ми се, че не ти трябва AND, ами OR в заявката. Т.к. търсиш дали поне едно поле от всичките съвпада с критерията ти.
Иначе казано, щом не ти връща грешка - заявката е добре, логиката куца.
 
Да, точно логиката ми куца в случая. Търсачката е за търсене на обяви (като в cars.bg) и трябва каквото е избрал потребителя това да търси. Примерно BMW 318 до 3000 лева. Това как става във случая? Досега съм правил само търсачки, които търсят по един критерии или най-много два, но толкова много не съм правил:(

Примерно цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw
 
За това ..
цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw

мисля ,че заявката тряя да изглежда така ...
Код:
Select * from` tablicaata` where `cena`>='500' OR `cena` <='2000' AND `year` >= '1990' OR `year`<= '2011' order by `date` desc

Но не сам я пробвал .. :)
 
не знам дали се усещaш, че това което си казал изглежда така:

[sql]... where
`cena`>='500' OR
(`cena` <='2000' AND `year` >= '1990') OR
`year`<= '2011' order by `date` desc[/sql]

без скоби AND се изчислява ПРЕДИ OR :)

според мен искаш да кажеш това, което и @replace e казал:
[sql]... where
(`cena`>='500' OR `cena` <='2000') AND
(`year` >= '1990' OR `year`<= '2011')
order by `date` desc[/sql]

но истинския проблем е, че @honda не е казал какво иска:
Примерно цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw
всъщност какъв е съюза, който е заместен със запетайки :)
цената да е между 500 и 2000 лева (И/ИЛИ) годината да е между 1990 и 2011 (И/ИЛИ) марка bmw


M1tq96 каза:
За това ..
цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw

мисля ,че заявката тряя да изглежда така ...
Код:
Select * from` tablicaata` where `cena`>='500' OR `cena` <='2000' AND `year` >= '1990' OR `year`<= '2011' order by `date` desc

Но не сам я пробвал .. :)
 
Honda каза:
Да, точно логиката ми куца в случая. Търсачката е за търсене на обяви (като в cars.bg) и трябва каквото е избрал потребителя това да търси. Примерно BMW 318 до 3000 лева. Това как става във случая? Досега съм правил само търсачки, които търсят по един критерии или най-много два, но толкова много не съм правил:(

Примерно цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw

[sql]SELECT * FROM `table` WHERE ( `cena`>'500' AND `cena`<'2000' ) AND ( `year`>'1990' AND `year`<'2011' )[/sql]

Това би трябвало да изведе резултати при които цената е между 500 и 2000,а годината между 1990 и 2011
 
palex каза:
не знам дали се усещaш, че това което си казал изглежда така:

[sql]... where
`cena`>='500' OR
(`cena` <='2000' AND `year` >= '1990') OR
`year`<= '2011' order by `date` desc[/sql]

без скоби AND се изчислява ПРЕДИ OR :)

според мен искаш да кажеш това, което и @replace e казал:
[sql]... where
(`cena`>='500' OR `cena` <='2000') AND
(`year` >= '1990' OR `year`<= '2011')
order by `date` desc[/sql]

но истинския проблем е, че @honda не е казал какво иска:
Примерно цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw
всъщност какъв е съюза, който е заместен със запетайки :)
цената да е между 500 и 2000 лева (И/ИЛИ) годината да е между 1990 и 2011 (И/ИЛИ) марка bmw


M1tq96 каза:
За това ..
цената да е между 500 и 2000 лева, годината да е между 1990 и 2011, марка bmw

мисля ,че заявката тряя да изглежда така ...
Код:
Select * from` tablicaata` where `cena`>='500' OR `cena` <='2000' AND `year` >= '1990' OR `year`<= '2011' order by `date` desc

Но не сам я пробвал .. :)

Съюзът е И. Извинявам се за пропуска :oops: Ще опитам нещата които сте дали и ще пиша

Код:
SELECT * 
FROM  `ads_parts` 
WHERE (
`price` >=  '500' OR  `price` <=  '2000'
)
AND (
`year` >=  '2008' OR  `year` <=  '2010'
)
ORDER BY  `date` DESC 
LIMIT 0 , 30

Изпълнява само втория аргумент - цена по-малка от 2000 и година по-малка от 2010 :( Със този код във момента ми листва всичко със цена < 2000 и година <2010 :( Надявам се да не ставам нахален, но Ви моля да ми помогнете, от 3 дена го мисля това и нищо не измислям, затова се принудих да пусна темата.. И благодаря на тези които опитаха, надявам се да не се окаже невъзможно това което искам :( Това по принцип ще се използва за автомобилен сайт и ще е точно за тази търсачка като на cars.bg и mobile.bg
 
[sql]SELECT *
FROM `ads_parts`
WHERE
( `price` BETWEEN '500' AND '2000' ) AND ( `year` BETWEEN '2008' AND '2010' )
ORDER BY `date` DESC
LIMIT 0 , 30[/sql]
 
Не ми се иска да го пиша, но дори така mysql връща празен резултат (а има такива, които отговарят на критерия). Вече взех да се притеснявам дали това изобщо може да се направи?

П.С. Ето Структурата + записите във БД-то във която искам да търся:

Код:
-- 
-- Структура на таблица `ads_parts`
-- 

CREATE TABLE `ads_parts` (
  `id` int(11) NOT NULL auto_increment,
  `password` varchar(10) NOT NULL,
  `model` int(11) NOT NULL,
  `marka` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `year` varchar(20) NOT NULL,
  `fuel` varchar(20) NOT NULL,
  `bodywork` varchar(255) NOT NULL COMMENT 'karoseriq',
  `region` int(11) NOT NULL,
  `price` varchar(20) NOT NULL,
  `expires` varchar(20) NOT NULL,
  `information` text NOT NULL,
  `phone` varchar(30) NOT NULL,
  `email` varchar(100) NOT NULL,
  `skype` varchar(100) NOT NULL,
  `hits` int(11) NOT NULL default '0',
  `lastUpdated` varchar(20) NOT NULL,
  `date` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

-- 
-- Дъмп (схема) на данните в таблицата `ads_parts`
-- 

INSERT INTO `ads_parts` VALUES (5, '0', 3, 1, 'nova obqva', '2010', '', 'cabrio', 2, '100', '1323810330', 'asdasd', '0888888888', 'isabel69@abv.bg', 'vodafone.live1', 3, '', '1321218347');
INSERT INTO `ads_parts` VALUES (4, '0', 3, 1, 'Test', '2008', '', 'cabrio', 2, '100', '1328975304', 'sadasd', '0888888888', 'gmania@abv.bg', 'vodafone.live1', 3, '1321218303', '1321199324');
INSERT INTO `ads_parts` VALUES (6, '0', 3, 1, 'nekva 4ast', '2011', '', 'hatchback', 2, '20000', '1329539654', 'asdsadsa', '0888888888', 'email@host.com', 'skype', 3, '', '1321763717');
INSERT INTO `ads_parts` VALUES (7, '0', 3, 1, 'chast', '2009', '', 'cabrio', 2, '800', '1329546701', 'asdadsa', '0888888888', 'gmania@abv.bg', 'skype', 3, '', '1321770746');
INSERT INTO `ads_parts` VALUES (8, '0', 3, 1, 'chast', '2009', '', 'cabrio', 2, '800', '1329546701', 'asdadsa', '0888888888', 'gmania@abv.bg', 'skype', 4, '1321772356', '1321770798');
INSERT INTO `ads_parts` VALUES (9, '0', 3, 1, 'PC Tunning', '2007', '', 'combi', 2, '800', '1329665934', 'asasdsadsad', '0888888888', 'gmania@abv.bg', 'skype', 3, '', '1321889986');
INSERT INTO `ads_parts` VALUES (10, '0', 3, 1, 'PC Tunning', '2007', '', 'combi', 2, '800', '1329666101', 'asasdsadsad', '0888888888', 'gmania@abv.bg', 'skype', 5, '1321890597', '1321890132');
 
Трябваше още в началото да дадеш структурата. Казвам го на теб и на всички останали които четат този форум:

ХОРА в SQL-а има различни типове данни - използвайте този който отговаря на информацията, която ще записвате, а не винаги VARCHAR.

@Honda при символни низове 500 е по-голям 2000 по същата причина по която Яна е по-голям от Павел. Годината ти се държеше както очакваш само защото всички години са ти еднаква дължина.

Като ти оправих цената да е DECIMAL(12,2), a годината INT и всички заявки проработиха :)
 
Ами...незнам какво да кажа - БЛАГОДАРЯ НА ВСИЧКИ!!! Извинявам се, че толкова късно дадох sql dump, но чак преди малко се усетих, че е възможно да бъркам във структурата..,
 
Искам само да вметна че SELECT * звездичка не е много удачно да се използава по добрият начин е SELECT име на запис, име на запис2, .....
по този начин се увеличава бързодействието
 

Back
Горе