Не могу разобраться с простой выборкой

@lexander

Новичок
Не могу разобраться с простой выборкой

Есть табличка:
PHP:
field1		field2
1			1
1			2
2			1
2			2
Как выбрать только те записи, которые по field1 содержат 1 и НЕ содержат 2. Условие НЕ должно быть выше по приоритету, чем содержит.

Т.е. Запрос должен вернуть
PHP:
field1		field2
1			2
запрос field1 = 1 AND field1 !=2 возвращает вполне логично
PHP:
field1		field2
1			1
1			2
Но для
PHP:
field1		field2
1			1
не выполняется « != 2»:
PHP:
field1		field2
2			1
Т.е. для ячейки 1 из field2 существует соответствующая ячейка в field1, равная 2, чего быть не должно.
 
Запрос field1 = 1 AND field1 !=2 равносилен field1 = 1, что тут еще добавлять. Напиши точнее что надо
 

@lexander

Новичок
Автор оригинала: shtogrin
Запрос field1 = 1 AND field1 !=2 равносилен field1 = 1, что тут еще добавлять. Напиши точнее что надо
Как выбрать только те записи, которые по field1 содержат 1 и НЕ содержат 2
 

chira

Новичок
@lexander

ещё раз, если поле field1 = 1, то оно уже не равно 2, т.е. условие 1!=2 выполняется ...

ты объясни простыми словами, чем по твоему отличаются записи для поля field1
field1 field2
1 1
1 2

и почему сочетание 1,2 для тебя подходит и сочетание 1,1 нет ...
 

zerkms

TDD infected
Команда форума
mod_tele:
[sql]
SELECT * FROM `table` `t1` INNER JOIN `table` `t2` ON `t1`.`field1` = `t2`.`field1` AND `t2`.`field2` != 1 AND `t1`.`field2` = 1 WHERE `t1`.`field1` = 1
[/sql]

(не пробовал, mysql под рукой нет)
 

@lexander

Новичок
Думаю, если перейти на конкретные примеры, понять будет легче:

Эта таблица осуществляет связку проектов и разделов, причем 1 проект может быть в нескольких разделах => уникальными являются пары «раздел - проект»

Задача состоит в том, что необходимо выкинуть из выборки те проекты, которые находятся в определённом разделе.

Пример:

пользователь хочет посмотреть проекты форумов (1)
Он находит нужную категорию и выбирает её

[sql]SELECT prj FROM razdel_prj WHERE razdel = 1[/sql]

Т.к. проект может входить в несколько категорий, то выборка вернёт кроме других, например, ещё и проекты досок (2).

Пользователю эти доски на.. не нужны => исключаем их из выборки. (по идее != 2)

Раньше выбирал через LIKE/NOT LIKE — проблем не было.
http://phpclub.ru/talk/showthread.php?s=&threadid=86325&rand=16
но как это реализовать на таблицах связей?
 
Если сформулировать человеским языком - Выбрать проэкты которые входят только в форумы(1)

Не совсем оптимально, но пока других мыслей нет

SELECT prj, COUNT(*) AS num
FROM razdel_prj
WHERE razdel = 1
GROUP BY prj
HAVING num=1
 

@lexander

Новичок
Автор оригинала: shtogrin
Если сформулировать человеским языком - Выбрать проэкты которые входят только в форумы(1)
Нет, могут быть и гостевые (3) :)
Главное, что бы не было досок (2) ;).
Выбрать n групп, отсечь m групп
 

Барби

Новичок
я не туда понял?
"Как выбрать только те записи, которые по field1 содержат 1 и НЕ содержат 2"
where field=1
но в примере у него уже два поля, тада так:
where field1=1 and field2<>2
его пример "не рабочей" выборки действительно абсурден "where field1=1 and field1!=2"

перечитал... бред
 

chira

Новичок
@lexander

почему бы не взять проекты из нужных тебе разделов
SELECT prj
FROM razdel_prj
WHERE razdel IN (1,3)

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

Здесь проблема не запросом, а проблема с данными. Если у него один проэкт и в форумах и в досках объявлений и в гостевых, то сначала надо почистить данные.
 

@lexander

Новичок
Автор оригинала: chira
@lexander

почему бы не взять проекты из нужных тебе разделов
SELECT prj
FROM razdel_prj
WHERE razdel IN (1,3)

бери данные которые нужны, дополнительную подстраховку делать не нужно
Именно в этом и заключается проблема:
Такой подход не даст нужного результата
PHP:
razdel        prj 
1                  1 
1                  2 
2                  1 
2                  2
Вы выберите проект с id = 1
но он находится так же в разделе 2. А этого быть не должно

-~{}~ 14.06.06 19:38:

Автор оригинала: shtogrin
сначала надо почистить данные.
Что чистить? Зачем? Проект может находится ОДНОВРЕМЕННО в n разделах.

-~{}~ 14.06.06 19:51:

Можно переформулировать вопрос и так:
Сначала читаем http://phpclub.ru/talk/showthread.php?s=&threadid=86325&rand=16

Как перейти с запроса вида:
SELECT * FROM projects WHERE razdel LIKE '%;1;%' AND NOT LIKE '%;2;%'

на таблицы связей?
 

Navarro

Новичок
$Id1 это искомый id
$Id2 исключаемый
Код:
$TVar=$Id1 & $Id2;
если по 2 полям
[sql]
Select * FROM `projects` where (`razdel` & `prj`) <>'$TVar'
[/sql]
если только по разделу
[sql]
Select * FROM `projects` where (`razdel` & '$Id2') <>'$TVar'
[/sql]

Что-то из них, судя по всему 2
 
Сверху