Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Подмогните с SQL запросом
цитата
16/04/07 в 00:10
 webboxxx
К примеру имеем такую структуру таблицы:
Код:
CREATE TABLE `tasks` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `item_name` varchar(100) NOT NULL default '',
  `deleted` tinyint(1) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM;


item_name может повторяться. задача в том, чтобы выдернуть все DISTINCT item_name WHERE deleted=1, но только если нет ни одной записи с таким же item_name, у которых deleted=0.

Если непонятно объяснил - пример:
Код:
ID | ITEM_NAME | DELETED
1 | aaa | 0
2 | bbb | 0
3 | bbb | 1
4 | ccc | 1


запрос должен вернуть только запись 4 ссс.
1 и 2 не возвращаем потому что deleted = 0.
3 не возвращаем потому что присутствует запись (2) с item_name = bbb и у нее deleted = 0.

Рейтинг по максимуму.
цитата
16/04/07 в 00:51
 A d u l t
Попробуй так:
Код:
SELECT
   DISTINCT t1.item_name
FROM
   tasks t1
WHERE
   t1.deleted = 1 AND
   (SELECT COUNT(t2.id) FROM tasks t2 WHERE t2.item_name=t1.item_name AND t2.deleted=0) = 0
цитата
16/04/07 в 01:05
 brainstorm
SELECT
t1.item_name
FROM
tasks t1 GROUP BY item_name HAVING count(deleted=0)=0

через HAVING должно быстрее вроде...
цитата
16/04/07 в 01:53
 webboxxx
оба варианта не работают.
вариант Adult'a вызывает ошибку:
Код:
near 'SELECT COUNT(t2.id) FROM tasks t2 WHERE ....'

версия мускуля 4.0.21

вариант brainstorm'a просто возвращает 0 рядов. icon_sad.gif
цитата
16/04/07 в 15:36
 proc3nt
У меня заработал такой код
Код:

SELECT DISTINCT item_name, MIN(deleted) as _min, MAX(deleted) as _max FROM tasks WHERE 1 GROUP BY item_name HAVING (_min=1 AND _max=1)

С тебя рейтинг icon_smile.gif
цитата
16/04/07 в 15:54
 webboxxx
да, работает, спасибо.


Эта страница в полной версии