Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно сделать запрос 
:(
    Опции темы
Viroman
Дата 22.10.2008, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



И так таблица 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 запрос?

Это сообщение отредактировал(а) Viroman - 22.10.2008, 22:45
PM MAIL   Вверх
Kesh
Дата 22.10.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



Код

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



--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
skyboy
Дата 22.10.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



если человек может иметь одно и то же "качество" более одного раза, то надо в 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 тоже.
PM MAIL   Вверх
Kesh
Дата 23.10.2008, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2488
Регистрация: 31.7.2002
Где: Германия, Saarbrü cken

Репутация: 15
Всего: 54



skyboy, точно... Запросы пишутся на коленке...


--------------------
user posted image
PM MAIL WWW ICQ Skype   Вверх
Viroman
Дата 23.10.2008, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



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

$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
)

PM MAIL   Вверх
Viroman
Дата 23.10.2008, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 140
Регистрация: 28.7.2008

Репутация: нет
Всего: нет



Чувствую, это нерешимая проблема силами скл  smile 
ибо мне необходимо, чтобы выдавались все значения, для которого изначально несколько условий выполнились. При том это должно происходить без группировки, то бишь, чтобы персон выдвалась столько раз, сколько та присутствует в таблице, раз для неё условия выполнились.
Мне нужна нека постфильтрация. Сколько бы не спрашивал, с этой задачей не могут справиться даже заядлые эксперты :( хотя мне уже и inner join на одну и ту же таблицу предложили..
PM MAIL   Вверх
Akina
Дата 23.10.2008, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Да ладно, нашел проблему... Поехали.

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

(
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', вне зависимости от наличия других характеристик. Или так - требуется отфильтровать все записи про тех знакомых, у которых отсутствует хотя бы одно из указанных качеств.

Это сообщение отредактировал(а) Akina - 23.10.2008, 22:34


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.