Автор Тема: составление запроса  (Прочитано 4943 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн new_coder

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 33
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
составление запроса
« : 30 Ноября 2007, 16:38:07 »
есть одинаковые структуры хранящиеся в двух таблицах

table1
   code
   name

table2
   code
   name

как из table1 выбрать строки которых нет в table2 (определяю по code)

немогу составить запрос.

Оффлайн for_i_0

  • $15 per hour
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 555
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.php.net/manual/en
составление запроса
« Ответ #1 : 30 Ноября 2007, 17:29:43 »
Вариант:


SELECT 
FROM  `table1WHERE `codeNOT IN (SELECT `codeFROM `table2`)
[off]Безработный[/off]

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
составление запроса
« Ответ #2 : 01 Декабря 2007, 00:46:55 »
[eq, у меня тоже есть вариант )))

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

SELECT * FROM (
   SELECT t1.*,  t2.`name` as t2_name
   FROM  `table1`t1 LEFT JOIN `table2` t2 USING (`code`)
) tt
WHERE tt.t2_name IS NULL


не пробывал конешно, но должно сработать ))

а по другому это так:


SELECT * FROM table1
WHERE code NOT IN (
   SELECT code
   FROM  `table1` t1 INNER JOIN `table2` t2
            USING (`code`, `name`)
)
« Последнее редактирование: 01 Декабря 2007, 00:56:16 от ravshaniy »
убили кенни, сволочи

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
составление запроса
« Ответ #3 : 01 Декабря 2007, 16:18:28 »
for_i_0
Решение правильное,
но ошибочное при большой базе данных, выдаст переполнение памяти.

можно так:
SELECT * FROM table1 t1
WHERE (
   SELECT 1
   FROM  table2 t2 where t2.code=t1.code limit 1
) is null
но это долгий вариант.
Не все является тем чем кажется.

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
составление запроса
« Ответ #4 : 02 Декабря 2007, 16:20:42 »
Цитировать
Altaxar:
for_i_0
Решение правильное,
но ошибочное

вобще сильно сказано )))))

честно говоря даже не понял как будет проходить ваш запрос - план запроса каков? интересно?
убили кенни, сволочи

Оффлайн Altaxar

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 222
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.moroseac.ru/
составление запроса
« Ответ #5 : 02 Декабря 2007, 22:47:17 »
ravshaniy
запрос for_i_0 имеет недостаток в большой базе данных, под запрос вернет список code  в виде массива, что и может создать ошибку при большой обьеме данных.
Мой метод возвращает 1 если есть в таблицы table2 code и если нету то null по этому признаку из первой таблицы и выводится результат.
я не проверял, но принцип такой.
Не все является тем чем кажется.

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
составление запроса
« Ответ #6 : 03 Декабря 2007, 12:16:25 »
Цитировать
Altaxar:
Мой метод возвращает 1 если есть в таблицы table2 code и если нету то null по этому признаку из первой таблицы и выводится результат.

вы знаете там в корне все не правильно

видите ли сначала будет исполняться подзапрос

Цитировать
Altaxar:
SELECT 1
FROM table2 t2 where t2.code=t1.code limit 1

и он обязательно ругнется на t1, потому что он не знает что такое t1. подзапрос он совсем не связан с запросом в целом.

опять же я не тестирую, но думаю я прав.

помоему нам уже нужно начать тестировать )))
убили кенни, сволочи

Оффлайн hanslinger

  • H2Oer
  • Ветеран
  • *****
  • Сообщений: 1148
  • +0/-0
  • 2
    • Просмотр профиля
    • http://www.orava.ru
составление запроса
« Ответ #7 : 03 Декабря 2007, 12:39:57 »
Ты бы сначала проверил, а потом выступал.
Работает даже такое:
UPDATE a SET a.x = (SELECT COUNT(b.id) FROM b WHERE b.y = a.z)

Оффлайн ravshaniy

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 191
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
составление запроса
« Ответ #8 : 03 Декабря 2007, 13:23:42 »
нда работает кстати. не прав прошу прощения
убили кенни, сволочи

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28