Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Запрос с условием
 
 автор: Loki   (25.01.2006 в 21:05)   письмо автору
 
 

пытаюсь сделать отчет по пользователям.
Структура тиблиц примерно следующая

CREATE TABLE 'ip_compact' (
  'init_ip' bigint(20) NOT NULL default '0',
  'end_ip' bigint(20) NOT NULL default '0',
  'city_id' int(11) NOT NULL default '0'


CREATE TABLE 'stat' (
  'stat_id' int(11) NOT NULL auto_increment,
  'stat_ip' bigint(20) NOT NULL default '0',
  'content_id' int(11) NOT NULL default '0',
  'putdate' datetime NOT NULL default '0000-00-00 00:00:00',
)

int_ip и end_ip - диапазон ip адресов
Пытаюсь одним запросом выбрать информацию обо всех посетителях посещавших страницу с определенным content_id. Пока выглядит так:

SELECT * FROM stat, ip_compact WHERE stat.content_id=6 AND stat_ip BETWEEN init_ip AND end_ip

Проблема в том, что если для данного IP регион не определен, то IP попросту не выводится. А мне нужно чтобы выводился, но без данных о местоположении. Чувствую, что IF мне поможет, но работающее условие составить не получается.

   
 
 автор: cheops   (25.01.2006 в 23:23)   письмо автору
 
   для: Loki   (25.01.2006 в 21:05)
 

Классическая задача для LEFT JOIN
SELECT * FROM stat LEFT JOIN ip_compact ON stat.content_id=6 AND stat_ip BETWEEN init_ip AND end_ip

Только возможно порядок следования таблиц в операторе FROM изменить, я не очень понял из какой таблицы необходимо оставить IP-адреса...

   
 
 автор: Loki   (25.01.2006 в 23:58)   письмо автору
 
   для: cheops   (25.01.2006 в 23:23)
 

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

   
 
 автор: Loki   (26.01.2006 в 11:06)   письмо автору
 
   для: cheops   (25.01.2006 в 23:23)
 

Попробовал. Как будто работает, но почему-то начисто игнорируется условие

stat.content_id=6

   
 
 автор: cheops   (26.01.2006 в 14:22)   письмо автору
 
   для: Loki   (26.01.2006 в 11:06)
 

А его в WHERE нужно засовывать
SELECT * FROM stat LEFT JOIN ip_compact ON stat_ip BETWEEN init_ip AND end_ip WHERE stat.content_id=6

помоему и BETWEEN тоже нужно... а чего-то у вас группировки нет - так надо?

   
 
 автор: Loki   (26.01.2006 в 14:37)   письмо автору
 
   для: cheops   (26.01.2006 в 14:22)
 

надо же, а я думал что ON - аналог WHERE... пошел курить мануал дальше:)

   
 
 автор: cheops   (26.01.2006 в 14:54)   письмо автору
 
   для: Loki   (26.01.2006 в 14:37)
 

ON используется только для связи таблиц, т.е. это бесплатное приложение к JOIN (aka ,) и LEFT JOIN. От мануала отравитесь - там местами ни по русски, ни по английски читать невозможно, но он стал гораздо лучше когда за него Поль Дюбуа взялся.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования