Подскажите с LEFT JOIN

#1 15 июля 2013 в 23:21
Таблица 1 (name)

  1. +----+-----------+
  2. | id | name |
  3. +----+-----------+
  4. | 1 | Книга |
  5. | 2 | Табуретка |
  6. | 3 | Карандаш |
  7. +----+-----------+
Таблица 2 (who)

  1. +------+-----------+
  2. | sid | name |
  3. +-------+-----------+
  4. | 646 | Книга |
  5. | 325 | Табуретка |
  6. | 666 | Карандаш |
  7. +-------+-----------+
Как выбрать все id из таблицы 1 так чтобы name Из таблицы 1 не встречался в таблице 2 с sid = "325"
Помогите плиз составить запрос…
#2 15 июля 2013 в 23:28
Попробуйте:
  1. SELECT n.id FROM name n LEFT JOIN who w ON w.name = n.name WHERE w.sid != 325
По идее он всё равно выведет с id 1, ибо name Книга есть и с другим sid
#3 15 июля 2013 в 23:45
+ в карму за помощь, пошел изучать матчасть)
#4 16 июля 2013 в 00:05
Join, вам стыдно не знать про JOIN smile
#5 16 июля 2013 в 00:13
Вот так что-то у меня с лефтом.

Чуток не правильно вопрос задал.
Вот как надо:

Как выбрать все name из таблицы 1 так чтобы name Из таблицы 1 не встречался в таблице 2 с sid = "325"?
#6 16 июля 2013 в 09:36
  1. SELECT n.name FROM name n LEFT JOIN who w ON w.name = n.name
  2. WHERE w.name NOT IN (SELECT name FROM who WHERE sid = 325)
Выведет Табуретка и Карандаш.
#7 16 июля 2013 в 10:39
Join, если столбец name присутствует и в первой таблице и во второй, то просто используете при запросе "DISTINCT name". и все. )
#8 16 июля 2013 в 11:40
stipp, там name Книга есть и с другим sid, если чё)
#9 16 июля 2013 в 13:31
  1. $query = "SELECT n.name FROM name n LEFT JOIN who w ON w.name = n.name
  2. WHERE w.name NOT IN (SELECT name FROM who WHERE sid = 325)";
  3. $result = mysql_query($query);
  4. $ref = mysql_num_rows($result);
Должен вроде вывести кол-во найденых строк… не выводит ...
  1. $query = "SELECT * FROM name WHERE id = 1)";
  2. $result = mysql_query($query);
  3. $ref = mysql_num_rows($result);
Такой простой запрос выводит.

Вспомнил… нужно же еще добавить в выборку условие, чтоб выбирал из первой таблицы с условием WHERE id=1
#10 16 июля 2013 в 13:57
Join, до:

Редактировалось: 2 раз (Последний: Сегодня в 13:27)

Join
у вас было написано, что в who две Книга, однако и при нынешнем раскладе запрос работает (во вложении).
Прикрепленный файл
aname_3j6bv.jpg 28 Кб
#11 16 июля 2013 в 14:06

Вспомнил… нужно же еще добавить в выборку условие, чтоб выбирал из первой таблицы с условием WHERE id=1

Join
Ну и раз во второй таблице значения не повторяются, то можно просто:
  1. SELECT n.name FROM name n LEFT JOIN who w ON w.name = n.name WHERE w.sid != 325 AND n.id = 1
#12 16 июля 2013 в 15:02

Ну и раз во второй таблице значения не повторяются

lokanaft
этот вариант работает, но если во второй таблице значение name повторяется, то результат неверный…
#13 16 июля 2013 в 15:12
Join, если повторяется, то запрос из поста 6 и он работает, как вы можете видеть по скрину. Но если вы добавите условие:

WHERE id=1

Join
То он ничего не выведет, потому что с ид 1 Книга, а она вчера дублировалась во второй таблице с sid 325, а раз этот sid запрещён, то он ничего и не выведет. Дальше сами разбирайтесь. Только не забудьте сначала всё вспомнить, чтобы потом не пришлось переделывать.
#14 16 июля 2013 в 16:21
  1. SELECT name FROM name WHERE id = 1 AND name NOT IN (SELECT name FROM who WHERE sid = 325)
вот так упростил и все работает как надо
#15 16 июля 2013 в 16:36
и left join в заголовке темы оказался не причем. просто прием not in "забыл"
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.