Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Как правильно сделать запрос


Автор: Viroman 22.10.2008, 22:43
И так таблица znakomie

person | kachestwo
-------------------
wowa | nehoroshij
kostik | srednij
andrej | otlichnij
misha | srednij
wowa | otlichnij
jura    | luchshij
misha | nehoroshij
jura    | otlichnij
В общем не обращайте внимание на название, а на суть, нужно подать ту person, где имеются одновременно два состояния, к примеру, where kachestwo='luchshij' and 'kachestwo=otlichnij', но так, чтобы эти два указанных состояния присутствовали в обязательном порядке, то есть те персоны, где только одно из этих качеств или вовсе никаких из указанных, чтобы не появлялись. То есть если даже одна и та же персона имеет качество otlichnij, но не имеет luchshij, или же имеет luchshij, но не имеет otlichnij, чтобы те также не рассматривались, помогите пожалуйста!
В моём примере по сути только jura имеет оба качества одновременно, по сути другие должны отфильтроваться, вот как это правильно теперь сделать?
Как правильно сформировать sql запрос?

Автор: Kesh 22.10.2008, 23:35
Код

SELECT `person`, count(`kachestwo`) as `num`
  FROM znakomie
WHERE kachestwo IN ('luchshij', 'otlichnij' )
GROUP BY `person` HAVING `num` = 2

Автор: skyboy 22.10.2008, 23:40
если человек может иметь одно и то же "качество" более одного раза, то надо в count добавить distinct:
Код

SELECT `person`, count(distinct `kachestwo`) as `num`
  FROM znakomie
WHERE kachestwo IN ('luchshij', 'otlichnij' )
GROUP BY `person` HAVING `num` = 2

иначе
Цитата

person | kachestwo
-------------------
wowa | otlichnij
kostik | srednij
andrej | otlichnij
misha | srednij
wowa | otlichnij
jura    | luchshij
misha | nehoroshij
jura    | otlichnij

вернет и wowa тоже.

Автор: Kesh 23.10.2008, 00:21
skyboy, точно... Запросы пишутся на коленке...

Автор: Viroman 23.10.2008, 11:48
Спасибо Вам обоим за помощь, но указанный вариант мне не совсем подходит, точнее, мне желательно, чтобы он выдавал из таблицы всё *, но не просто всё, а сразу бы подавал оба варианта, типа
Код

$sql="SELECT *, count(distinct `kachestwo`) as `num`
  FROM znakomie
WHERE kachestwo IN ('luchshij', 'otlichnij' )
GROUP BY `person` HAVING `num` = 2";

$result=mysql_query($sql);
while ($myrow = mysql_fetch_assoc($result)) { print_r($myrow); }

Хочу, чтобы он выдал всё и не просто так, а как в моём примере обе строчки, типа 
Array
(
    [person] => jura
    [kachestwo] => luchshij
)

Array
(
    [person] => jura
    [kachestwo] => otlichnij
)

Автор: Viroman 23.10.2008, 16:22
Чувствую, это нерешимая проблема силами скл  smile 
ибо мне необходимо, чтобы выдавались все значения, для которого изначально несколько условий выполнились. При том это должно происходить без группировки, то бишь, чтобы персон выдвалась столько раз, сколько та присутствует в таблице, раз для неё условия выполнились.
Мне нужна нека постфильтрация. Сколько бы не спрашивал, с этой задачей не могут справиться даже заядлые эксперты :( хотя мне уже и inner join на одну и ту же таблицу предложили..

Автор: Akina 23.10.2008, 17:16
Да ладно, нашел проблему... Поехали.

Первый запрос - тупо убираем дубли, и отбираем нужные качества.
Код

(
Select distinct person as p, kachestwo as k
from znakomie as z
where kachestwo in ('luchshij', 'otlichnij' )
) as q1

Второй запрос - считаем количество вхождений, и отбираем те, что имеют требуемое количество вхождений.
Код

(
select p, count(p)
from q1
group by p
having count(p)=2
) as q2
И теперь выгребаем все нужные записи
Код

Select person, kachestwo
from znakomie
inner join q2
on znakomie.person=q2.p

Осталось собрать всё в один запрос
Код

Select person, kachestwo
from znakomie
inner join 
  (
  select p, count(p)
  from 
    (
    Select distinct person as p, kachestwo as k
    from znakomie as z
    where kachestwo in ('luchshij', 'otlichnij' )
    ) as q1
  group by p
  having count(p)=2
  ) as q2
on znakomie.person=q2.p


PS. Это если я правильно понял условие - требуется вывести ВСЕ записи про всех знакомых, у кого хотя бы по разу встречается и 'luchshij', и 'otlichnij', вне зависимости от наличия других характеристик. Или так - требуется отфильтровать все записи про тех знакомых, у которых отсутствует хотя бы одно из указанных качеств.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)