Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите сделать выборку с исключениями

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
NeuroZ
Отправлено: 26 Июня, 2012 - 17:09:19
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




есть таблица
id | name | data

Нужно выбрать все данные, где data = 1 и если name повторяется в таблице, то поля с таким name не выбирать вообще (собсно в этом и проблема)
 
 Top
Мелкий Супермодератор
Отправлено: 26 Июня, 2012 - 17:13:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Сгруппируйте по name и всё.
Или select distinct


-----
PostgreSQL DBA
 
 Top
eai
Отправлено: 26 Июня, 2012 - 17:24:08
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 521
Дата рег-ции: Сент. 2009  
Откуда: Петроград


Помог: 10 раз(а)




Попробуй как то так
MIN я использовал только что бы была какая то агрегация на поле

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT min(id), name, count(DATA)
  2.  
  3. FROM TABLE
  4.  
  5. WHERE DATA = 1
  6.  
  7. GROUP BY name
  8.  
  9. HAVING count(DATA)=1
 
 Top
NeuroZ
Отправлено: 26 Июня, 2012 - 17:32:47
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Мелкий пишет:
Сгруппируйте по name и всё.
Или select distinct

Так вроде SELECT DISTINCT будет удалять только столбцы с одинаковым именем. Т.е. хотя бы 1 столбец он выведет.
т.е.
id | name | data
1 | one | 1
2 | two | 1
3 | one | 2

Мы получим (используя дистинкт) и исключение по`data`
id | name | data
1 | one | 1
2 | two | 1

А нужен результат
id | name | data
2 | two | 1
(Добавление)
eai пишет:
Попробуй как то так
MIN я использовал только что бы была какая то агрегация на поле

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT min(id), name, count(DATA)
  2.  
  3. FROM TABLE
  4.  
  5. WHERE DATA = 1
  6.  
  7. GROUP BY name
  8.  
  9. HAVING count(DATA)=1

Вообще решения не вижу. Задача в том, чтобы не выбирались поля, если name хотя бы 1 раз повторилось.

(Отредактировано автором: 26 Июня, 2012 - 17:59:50)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Июня, 2012 - 19:28:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




NeuroZ пишет:
Вообще решения не вижу. Задача в том, чтобы не выбирались поля, если name хотя бы 1 раз повторилось.

Тем не менее, это - решение для вашей задачи.


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 26 Июня, 2012 - 19:34:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Мелкий пишет:
NeuroZ пишет:
Вообще решения не вижу. Задача в том, чтобы не выбирались поля, если name хотя бы 1 раз повторилось.

Тем не менее, это - решение для вашей задачи.

Тогда можно пожалуйста готовый код, я думаю Вам не составит труда написать пару строчек.
 
 Top
Мелкий Супермодератор
Отправлено: 26 Июня, 2012 - 20:54:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Уже написан. Весь смысл в группировке и последующем having'е - выбираются те, количество строк которых = 1


-----
PostgreSQL DBA
 
 Top
NeuroZ
Отправлено: 26 Июня, 2012 - 21:16:18
Post Id



Посетитель


Покинул форум
Сообщений всего: 393
Дата рег-ции: Апр. 2012  


Помог: 2 раз(а)




Говорю же не работает.
Суть сводиться к тому, чтобы НЕ ВЫБИРАТЬ значения у которых повторяется name. А у нас в любом случае ВЫБИРАЕТСЯ хотя бы ОДНО.
(Добавление)
Если отдельно делать
SELECT *
FROM `table`
GROUP BY `name`
HAVING COUNT( * ) =1
ORDER BY `name`

То всё хорошо. А если так

SELECT *
FROM `table`
WHERE `data` = 1
GROUP BY `name`
HAVING COUNT( * ) =1
ORDER BY `name`

То все плохо.
(Добавление)
SELECT *
FROM `table`
GROUP BY `name`
HAVING COUNT( * ) =1
AND `data` =1

так вроде заработало

(Отредактировано автором: 26 Июня, 2012 - 21:31:31)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB