SeryiVolk
27.08.2009 - 13:27
таблица примерно такая:
Name last articul
ivan petrov 622
ivan petrov 623
petya ivanoff 2000
kolya pupkin 621
kostya popov 621
kostya popov 622
нужно выбрать всех людей не имеют артикля 622
xPoint
27.08.2009 - 13:33
SELECT * FROM table WHERE articul!=622
так чтоли?
SeryiVolk
27.08.2009 - 13:40
Цитата (xPoint @ 27.08.2009 - 09:33) |
SELECT * FROM table WHERE articul!=622 так чтоли? |
нет так не получится потому как имена тогда будут дублироваться.
так же как и в этом случае -
SELECT DISTINCT *
FROM STAT
WHERE (StatARTICUL NOT IN (622))
ORDER BY name
glock18
27.08.2009 - 13:48
SQL |
SELECT * FROM STAT WHERE StatARTICUL <> 622 GROUP BY name, last ORDER BY name |
такое надо?
DenPHP
27.08.2009 - 13:56
SQL |
SELECT DISTINCT * FROM STAT WHERE articul != 622[s] |
SeryiVolk
27.08.2009 - 14:18
нет.
смотрите -
Name last articul
ivan petrov 622
ivan petrov 623
при вашем запросе - SELECT DISTINCT * FROM STAT WHERE articul != 622
все равно в критерий попадает ivan petrov
потому как есть запись ivan petrov 623
DenPHP
27.08.2009 - 14:29
огогось....неа..я ток новичок..как и это сделать х3...
наверное двоной обработкой после выборки
glock18
27.08.2009 - 14:31
SQL |
SELECT CONCAT(s.name, ' ', s.last) as fullname FROM (SELECT CONCAT(name,' ', last) as name FROM stat s WHERE id = 622) filter JOIN stat ON filter.name <> fullname; |
Типа этого что-то. Не очень оптимальное решение.
SeryiVolk
27.08.2009 - 14:52
Цитата (glock18 @ 27.08.2009 - 10:31) |
SQL | SELECT CONCAT(s.name, ' ', s.last) as fullname FROM (SELECT CONCAT(name,' ', last) as name FROM stat s WHERE id = 622) filter JOIN stat ON filter.name <> fullname; |
Типа этого что-то. Не очень оптимальное решение.
|
спасибо.
но если честно, никак не могу применить ваш совет
не пойму CONCAT и id = 622
их надо заменить?
Tigrus
27.08.2009 - 14:56
Когда мне подобную задачу надо было решить - я её решил повторной обработкой на уровне PHP.
Подумаю как решить на уровне базы.
Michael
27.08.2009 - 15:05
SQL |
select * from stat where concat(name,last) not in (select concat(name,last) from stat where articul=622) |
_____________
There never was a struggle in the soul of a good man that was not hard
glock18
27.08.2009 - 15:13
Цитата |
не пойму CONCAT и id = 622 их надо заменить? |
а, ну да. id это то же самое, что articul или как там его. а CONCAT не надо менять. так и оставь.
результат будет тебе выдан в одной ячейке. ivan petrov. если не надо в одной, то запрос легко достаточно переписывается.
glock18
27.08.2009 - 15:14
Michaelда, так посимпотичней
![smile.gif](http://phpforum.su/html/emoticons/smile.gif)
хотя то же самое почти.
PS:
по правде говоря, затрудняюсь сказать какое решение быстрее. Твое явно красивее, но я боюсь, что оно несколько медленней. сейчас для теста табличку что ли такую заделаю, да проверю. интересно.
SeryiVolk
27.08.2009 - 15:21
Цитата (Michael @ 27.08.2009 - 11:05) |
SQL | select * from stat where concat(name,last) not in (select concat(name,last) from stat where articul=622) |
|
так у меня тоже ошибку выдает
жалуется на concat (Function unknown. CONCAT.)
P.S.
glock18 заделай табличку, может вместе проверим )
glock18
27.08.2009 - 15:41
и так вот что у меня получилось:
SQL |
CREATE TABLE `articul`( name VARCHAR(255), last VARCHAR(255), articul INTEGER ); |
SQL |
INSERT INTO `articul` VALUES ('ivan', 'petrov', 622), ('ivan', 'petrov', 623), ('petya', 'ivanoff', 2000), ('kolya', 'pupkin', 621), ('kostya', 'popov', 621), ('kostya', 'popov', 622); |
когда начал выполнять понял, что мой не работает так, как надо
Вариант
Michael работает. хотя explain был нехороший достаточно. из-за этого я и хотел заставить my
sql выполнять вложенный запрос один раз, вместо раза для каждой записи. Он серьезно тормозить, но мое решение оказалось ошибочным. Сейчас еще немного подумаю над этим, но затрудняюсь пока в дальнейшей оценке.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.