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]   

> Без описания
grizzlynet
Отправлено: 06 Января, 2012 - 21:53:05
Post Id



Новичок


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


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




Добрый вечер!
Разбираю пример. Подзапрос возвращает мне число 16, почему весь запрос возвращяет empty set(0.00). Условие то = должно выполнится. Возможно недопонимаю....
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT mc.first_name,mc.last_name FROM my_contacts AS mc WHERE 16 = (SELECT count(*) FROM contact_interest WHERE contact_id = mc.contact_id);
 
 Top
DeepVarvar Супермодератор
Отправлено: 06 Января, 2012 - 22:37:59
Post Id



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


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Мб...
CODE (SQL):
скопировать код в буфер обмена
  1. ... WHERE contact_interest.contact_id = mc.contact_id ...

Хм... это где кол-во интересных контактов равно 16, ни больше не меньше?
Странная у вас выборка...
 
 Top
evgenijj
Отправлено: 07 Января, 2012 - 03:50:10
Post Id



Участник


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


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




Я долго пытался приладить этот запрос к реальной ситуации, и в конце концов мне это удалось. Получилось неудачно, коряво, но тем не менее
Пусть у нас есть некая off-line фирма, торгующая куртками. Дела идут хорошо, и спустя три-четыре года владелец фирмы решает открыть сайт (on-line филиал). Постоянные клиенты получают скидки -- кто уже купил две куртки, получает скидку 10%. Некоторое off-line покупатели перешли в on-line -- надо их вычислить, и предоставить скидку
Все покупатели представлены в двух таблицах базы данных (опять-же -- данных мало, надо сочинять)
CUSTOMERS (ПОКУПАТЕЛИ ON-LINE)
CODE (text):
скопировать код в буфер обмена
  1. customer_id  name     surname
  2. 2            Василий  Васильев
  3. 1            Петр     Петров

ЗАКАЗЫ (OFF-LINE)
CODE (text):
скопировать код в буфер обмена
  1. customer_id  customer_name  customer_surname  order_id
  2. 3            Иван           Иванов            1
  3. 4            Сидор          Сидоров           2
  4. 1            Петр           Петров            3
  5. 2            Василий        Васильев          4
  6. 1            Петр           Петров            5
  7. 2            Василий        Васильев          6

И у нас возникла задача -- предоставить всем on-line покупателям, которые уже делали два раза off-line заказы, скидку:
CODE (text):
скопировать код в буфер обмена
  1. SELECT c.name, c.surname FROM customers AS c WHERE 2 =
  2.   ( SELECT COUNT(*)
  3.     FROM orders
  4.     WHERE customer_id = c.id )

Результат
CODE (text):
скопировать код в буфер обмена
  1. Василий  Васильев
  2. Петр     Петров

В общем -- работает. Хотя и трудно представить, где бы это могло быть востребовано.

P.S. Структура БД придумана, и ни один вменяе... прогр... да такой х... не доду...
 
 Top
grizzlynet
Отправлено: 07 Января, 2012 - 08:41:44
Post Id



Новичок


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


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




evgenijj пишет:
спасибо за пример


DeepVarvar пишет:
это учебный пример из книги


Мне не понятно, почему не работает условие =.
Внешний запрос возвращает first_name, last_name и подзапрос возвращяет 16.
Прикреплено изображение (Нажмите для увеличения)
table.jpg

(Отредактировано автором: 07 Января, 2012 - 08:44:00)

 
 Top
grizzlynet
Отправлено: 08 Января, 2012 - 18:18:30
Post Id



Новичок


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


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




Разобрался, надо в подзапросе втавить естественное соединение.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT mc.first_name,mc.last_name FROM my_contacts AS mc WHERE 16 = (SELECT count(*) FROM contact_interest NATURAL JOIN my_contacts AS mc WHERE contact_id = mc.contact_id);
  3.  

Хорошо

(Отредактировано автором: 08 Января, 2012 - 18:19:21)

 
 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