MySQL запытаў вяртаюцца няслушныя вынікі

Даведачная інфармацыя ...

Я спрабую зварот у базу, каб убачыць, што арэнда нерухомасці мы маем у наяўнасці ў зададзеным дыяпазоне дат. Спосаб захоўвання жудасна, але гэта ствараецца з дапамогай настольнай праграмы: / Сайт напісаны на Wordpress, але я нават не магу атрымаць правільныя вынікі, нават калі я ўручную ў звароце да базы дадзеных.

Праблема... Ёсць 3 калонкі ў базе даных: propid , av_date і карысць . У мяне ёсць ўласцівасць, якое замоўлена 31 траўня і 8 чэрвеня, але ў любы дзень паміж імі. Пры праглядзе дадзеных у табліцы, гэта выглядае наступным чынам:

propid   av_date     avail

1051     2013-05-31  U
1051     2013-06-01  A
1051     2013-06-02  A
1051     2013-06-03  A
1051     2013-06-04  A
1051     2013-06-05  A
1051     2013-06-06  A
1051     2013-06-07  A
1051     2013-06-08  U

Калі я запускаю наступны запыт, ўласцівасць ўсё яшчэ паказвае ўверх ...

SELECT DISTINCT propid
FROM availabilities
WHERE avail = 'A'
AND av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');

Я быў біць галавой аб сцяну на працягу 2-х дзён над гэтым, так што гэта, верагодна, што-то па-дурному, але любая дапамога будзе прынятая з удзячнасьцю!

1
што ваш чаканы вынік?
дададзена аўтар Ochi, крыніца
што ваш чаканы вынік?
дададзена аўтар Ochi, крыніца
Што вы маеце на ўвазе пад «маёмасць ўсё яшчэ паказвае ўверх»? Я б чакаць, што ваш запыт, каб атрымаць усе радкі, дзе = карысць «A» <�я> і av_date у спісе дат. Для дадзеных узораў, што здараецца ўсе радкі з кодам <> = толку «A» . Які вынік вы хочаце?
дададзена аўтар Ed Gibbs, крыніца
Што вы маеце на ўвазе пад «маёмасць ўсё яшчэ паказвае ўверх»? Я б чакаць, што ваш запыт, каб атрымаць усе радкі, дзе = карысць «A» <�я> і av_date у спісе дат. Для дадзеных узораў, што здараецца ўсе радкі з кодам <> = толку «A» . Які вынік вы хочаце?
дададзена аўтар Ed Gibbs, крыніца
«Av_date IN (....)» Толькі патрэбен адзін удар, каб прайсці як дакладна. Тое, дзе праблема ёсць ..
дададзена аўтар Johan, крыніца
«Av_date IN (....)» Толькі патрэбен адзін удар, каб прайсці як дакладна. Тое, дзе праблема ёсць ..
дададзена аўтар Johan, крыніца

7 адказы

Калі вы хочаце выключыць ўласцівасць цалкам, калі ён мае выгада = «U» у дыяпазоне дат, паспрабуйце падлік ўваходжання U і апускаючы любы, якія маюць па крайняй меры адзін U :

SELECT propid
FROM availabilities
WHERE av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08')
GROUP BY propid
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0

І, нарэшце, вы можаце выкарыстоўваць дыяпазон для дат з ПАМІЖ , які робіць запыт карацей і прасцей у абслугоўванні:

SELECT propid
FROM availabilities
WHERE av_date BETWEEN '2013-05-31' AND '2013-06-08'
GROUP BY propid
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0
1
дададзена
Гэта тое, што мне не хапала! Дзякуй!
дададзена аўтар Kevin Daniel, крыніца

Калі вы хочаце выключыць ўласцівасць цалкам, калі ён мае выгада = «U» у дыяпазоне дат, паспрабуйце падлік ўваходжання U і апускаючы любы, якія маюць па крайняй меры адзін U :

SELECT propid
FROM availabilities
WHERE av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08')
GROUP BY propid
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0

І, нарэшце, вы можаце выкарыстоўваць дыяпазон для дат з ПАМІЖ , які робіць запыт карацей і прасцей у абслугоўванні:

SELECT propid
FROM availabilities
WHERE av_date BETWEEN '2013-05-31' AND '2013-06-08'
GROUP BY propid
HAVING COUNT(CASE WHEN avail = 'U' THEN 1 END) = 0
1
дададзена
Гэта тое, што мне не хапала! Дзякуй!
дададзена аўтар Kevin Daniel, крыніца

Ваш запыт знайсці ўласцівасці, якія даступныя на любы з дат. Для таго, каб атрымаць усе даты, у вас ёсць набор-унутры-мностваў пытанне. Я лічу, лепшы падыход агрэгацыя з , які мае пункт.

SELECT propid
FROM availabilities
group by propid
having sum(case when av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08') and
                     avail <> 'A'
                then 1
                else 0
           end) > 0

<�Код>, які мае пункт падлічвае колькасць радкоў, дзе ўмова <�ет> не праўда. Калі ёсць, то ўласцівасць не ўваходзіць. Вы таксама можаце падысці да гэтага, як:

SELECT propid
FROM availabilities
group by propid
having sum(case when av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08') and
                     avail = 'A'
                then 1
                else 0
           end) = 9;

<�Код> 9 гэта колькасць дат у наборы.

0
дададзена

паспрабаваць:

SELECT propid, avail, av_date
FROM availabilities
GROUP BY propid HAVING avail = 'A'
AND av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');
0
дададзена
<�Код> абярыце выразны з адным поля функцыянальна ідэнтычна звычайным запытам групоўкі па гэтым полі. Вы не змянілі нічога, акрамя сінтаксісу.
дададзена аўтар Marc B, крыніца

паспрабаваць:

SELECT propid, avail, av_date
FROM availabilities
GROUP BY propid HAVING avail = 'A'
AND av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');
0
дададзена
<�Код> абярыце выразны з адным поля функцыянальна ідэнтычна звычайным запытам групоўкі па гэтым полі. Вы не змянілі нічога, акрамя сінтаксісу.
дададзена аўтар Marc B, крыніца

Вы можаце выключыць propids з любой негатовасці дапамогай NOT EXISTS:

SELECT DISTINCT a.propid 
FROM availabilities a
WHERE NOT EXISTS
( SELECT 1
FROM availabilities b
WHERE b.avail = 'U' 
AND b.propid = a.propid 
AND b.av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');
)

Подзапросов можа ўключаць у сябе ўмова, заснаванае на значэннях ад наяўнасці а.

0
дададзена

Вы можаце выключыць propids з любой негатовасці дапамогай NOT EXISTS:

SELECT DISTINCT a.propid 
FROM availabilities a
WHERE NOT EXISTS
( SELECT 1
FROM availabilities b
WHERE b.avail = 'U' 
AND b.propid = a.propid 
AND b.av_date IN ('2013-05-31', '2013-06-01', '2013-06-02', '2013-06-03', '2013-06-04', '2013-06-05', '2013-06-06', '2013-06-07', '2013-06-08');
)

Подзапросов можа ўключаць у сябе ўмова, заснаванае на значэннях ад наяўнасці а.

0
дададзена