Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Научите меня правильно строить сложные запросы к базе данных

Ответить
Настройки темы
Научите меня правильно строить сложные запросы к базе данных

Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120


Конфигурация

Профиль | Отправить PM | Цитировать


Пhедположим такая ситуация
Есть 2 таблицы: users, ids
В первой есть строки name, email
Во второй: name, id
Задача запроса: вывести name, email из первой таблицы когда name из 1 равен name из 2 и id равен 5

Я пишу:
select A.name, A.email from users A, ids B where A.name=B.name and B.ids=5

Но такой вариант не проходит
Подскажите плиззз где у меня ошибка

[s]Исправлено: vadimiron, 1:48 22-05-2004[/s]

-------
Fortes fortuna adiuvat


Отправлено: 00:25, 22-05-2004

 

Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Для MySql (есть стандарт, но его, имхо, мало кто придерживается или стандартов много ):
Код: Выделить весь код
select A.name, A.email from users as A, ids as B where (A.name=B.name) and (B.id=5)
На счет запросов понятно... непонятна организация данных. ID это уникальный номер пользователя? Тогда вторая таблица вообще не нужна, вторая таблица в большинстве таких случаев необходима для связи "1-n" - один ко многим. К примеру нужно хранить права конкретного человека на редактирование тех или иных частей сайта, файло или еще чего. То есть таких "еще чего" - много, вот и получается связь один ко многим. Вообще существует механизм (математический) по построению БД. Надо проанализировать рабочую область данных, выявить сущности (объекты области, скажем пользователь, страница и т. д.) ее атрибуты (они в последствии станут полями), связи (связи в последствии могут стать отдельными таблицами в зависимости от вида связи), построить ER-диаграмму (часто опционально, но жутко полезно), потом провести проверку на Нормальные Формы: 1НФ, 2НФ, 3НФ и "иногда" НФ Бойса-Кодда. В общем это надо до создания работать еще, правда на не сложных БД можно сделать все и так - просто интуитивно ясно где и как организовать таблицы и их поля, интуитивно избегнуть избыточности и интуитивно же понять где избыточность компенсируется быстродейсвием.

На счет нормализации можно почитать здесь, а поисковики выдадут еще кучу статей и доков на основе тех слов которые будут вам непонятны.

[s]Исправлено: Prisoner, 5:16 22-05-2004[/s]

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 05:14, 22-05-2004 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


Да я учил всё это, но с моим объёмом и сложностью базы данных, я не стал так серьёзно подходить к делу

Этот вариант тоже не проходит
В браузер выводится: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource - то есть запрос почему то не правильно построен

Может я что с индексами начудил???

первая таблица: много информации о юзере (в том числе name, email-которые мне сейчас нужны, верней только email, так как name я уже знаю)
вторая таблица: три столбца по сессии: id-уникальный номер сессии, name-имя юзера, который открыл сессию, time-время открытия сессии

И вот как мне сделать подобный запрос к таким таблицам???

И ещё как правильно здесь было бы организовать индексы???

Добавлено:

УУУУУУпс

у меня была одна лишняя скобка
Поэтому ничего не работало

Но в любом случае объясните, нужно ли в данной ситуации вводить индексы (сейчас у меня и без них всё работает), верней то, что нужно, я знаю, поиск намного быстрей, но самое главное как в данной ситуации организовать индексы, на каких полях и тд.

И почему создатели PHP не сделали хотя простейшую проверку синтаксиса запросов mysql??
Тогда бы я полдня бы не ломал голову, хотя эо было всего лишь лишняя скобка

-------
Fortes fortuna adiuvat


Отправлено: 13:36, 22-05-2004 | #3

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


1) насчет id (и всего остального - респект - согласна с Prisoner (соответственно, связь через id)
2) id скорее всего должен быть auto_increment и PRIMARY KEY (те генериться автоматически и быть первичным ключем - те тоже своего рода индексом)
3) я вообще предпочитаю стиль, когда свой такой id вводится в каждой таблице
4) в другой таблице надо соответственно ввести поле - что-то вроде user_id и на него посадить индекс
3) индексом стоит наградить все поля, по которым будут идти выборки, но следует иметь в виду, что при небольшом количестве записей работать они (индексы), при запросах все равно скорей всего не будут
4) Проверить что и как работает можно при помощи оператора EXPLAIN *
работать у тебя будет, кстати говоря и без индексов, но при увеличении объема базы работать будет все медленнее (для того индексы в бд и существуют, чтобы по ним быстро шерстить)
Кстати, в апрельском номере PHP inside
опубликован перевод очень неплохой статьи "Шаблоны баз данных в MySQL" Рассела Дайера. *

Отправлено: 21:31, 22-05-2004 | #4


Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


mar

id у меня не связан с юзером, id-это номер сессии, а уже в этой же таблице есть столбец name, который указывает на открывшего данную сессию пользователя

-------
Fortes fortuna adiuvat


Отправлено: 01:54, 23-05-2004 | #5

mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3904
Благодарности: 163

Профиль | Отправить PM | Цитировать


vadimiron
я об этом и писала - подумай сам: какие поля занимают больше места? какие поля легче индексируются? наконец за уникальностью каких полей легче следить?
в твоем случае проще ихмо что-то вроде:
Первая таблица:
Код: Выделить весь код
CREATE TABLE users (
 *id int(11) NOT NULL auto_increment, -- уникальный id 
 *name varchar(32) NOT NULL default '', -- логон
 *password varchar(32) NOT NULL default '', -- пароль
 *perms varchar(255) NOT NULL default 'user', -- права (если разные)
 *realname text NOT NULL, -- настоящее имя
 *email varchar(255) NOT NULL default '',
 *comments text, -- комментарии
 *created_by int(11) NOT NULL default '0', -- кем создана запись
 *is_enabled int(11) NOT NULL default '1', -- активна
 *deleted int(11) NOT NULL default '0', -- удалена
-- и всякое прочее по вкусу и необходимости
 *PRIMARY KEY *(id),
 *KEY email (email),
 *KEY username (name) 
 *-- и прочие ключи, какие там еще
) TYPE=MyISAM; -- или в зависимости от версии MySQL
Вторая таблица:
Код: Выделить весь код
CREATE TABLE ids (
 *id int(11) NOT NULL auto_increment, -- уникальный id 
 *user_id, -- id юзера из первой таблицы
 *date timestamp(14) NOT NULL, -- время открытия сессии
 *PRIMARY KEY *(id),
 *KEY user_id (user_id),
 *KEY date (date)
) TYPE=MyISAM; -- или в зависимости от версии MySQL

[s]Исправлено: mar, 20:31 23-05-2004[/s]

Отправлено: 20:29, 23-05-2004 | #6


Аватара для vadimiron

Ветеран


Сообщения: 1864
Благодарности: 120

Профиль | Отправить PM | Цитировать


Всё хорошо и красиво только у id я не смогу auto_increment поставить, так как id устанавливается функцией rand при заходе юзера, то есть я усвтанавливаю свои значения для id, auto_increment не подходит

-------
Fortes fortuna adiuvat


Отправлено: 02:07, 24-05-2004 | #7


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


vadimiron
пример сложного запроса:
Код: Выделить весь код
//чдение из базы информации о постах
$postlist=mysql_query('SELECT post.post,
                              post.n as postn,
                              post.date,
                              post.ip,
                              avatar.avatar,
                              users.name,
                              users.id,
                              users.nposts,
                              users.regdate,
                              users.email,
                              users.showemail,
                              users.showip,
                              users.signature,
                              users.undername,
                              users.nrewords,
                              users.admin,
                              users.moder
                         FROM post,
                              users,
                              avatar
                        WHERE post.topicid='.$topicdata['id'].'
                          and users.id=post.userid
                          and avatar.id=users.avatar
                     ORDER BY post.n
                        LIMIT '.$start.', '.$end.' ;');
vadimiron
скорее всего проблемма не в запросе, а в самом скрипте!

можеть выложить весь кусок кода?

vadimiron
ты не правильно понял смысл ошибки!

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 22:06, 26-05-2004 | #8


Аватара для Prisoner

Engrossed by the Void


Сообщения: 2229
Благодарности: 60

Профиль | Отправить PM | Цитировать


Ой, а можно я тоже "сложным" запросом похвастаюсь? А то самокритика ведет - 333:1 .
             
Код: Выделить весь код
SELECT DISTINCT
                 `news`.`n_id`,
                 `news`.`n_desc`,
                 `news`.`n_dt`,
                 `regions`.`r_name`,
                 `news`.`n_cap`,
                 `categories`.`c_name`
               FROM
                 `news`,
                 `n_c`,
                 `n_r`,
                 `regions`,
                 `categories`
               WHERE
                 (`news`.`n_id` = `n_c`.`n_id`) AND
                 (`news`.`n_id` = `n_r`.`n_id`) AND
                 (`news`.`n_dt` <= \''.$DateB.'\') AND
                 (`news`.`n_dt` >= \''.$DateE.'\') AND
                 (`n_r`.`r_id` = `regions`.`r_id`) AND
                 (`n_c`.`c_id` = `categories`.`c_id`) AND
                 (`n_r`.`r_id` = 1) AND
                 (`n_c`.`c_id`>100) AND
                 (`n_c`.`c_id`<200)
                 '.$QCatReg.'
               ORDER BY
                 `news`.`n_dt` DESC'


На счет проверки синтаксиса запроса нужно обращаться по адресу . Зачем php об этом думать, если это не его задача? Другой вопрос, что он знает об ошибке последнего запроса, знает и молчит, заставит же его говорить об этом функция mysql_error().

-------
Не могу дать более дельный совет - не хватает системных ресурсов...


Отправлено: 01:14, 29-05-2004 | #9


Ночной странник


Contributor


Сообщения: 4050
Благодарности: 83

Профиль | Сайт | Отправить PM | Цитировать


Prisoner
я думаю что у vadimiron в функцию mysql_fetch_row() передается не то чно нужно!

т.к. PHP выдает свою ошибку а не ошибку MySQL!

-------
можно практически все, но просто мы это еще не знаем.
главный враг програмиста это копипастинг
За хорошее сообщение не забываем нажимать ссылочку "Полезное сообщение"!


Отправлено: 02:24, 29-05-2004 | #10



Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Научите меня правильно строить сложные запросы к базе данных

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
C/C++ - Как правильно задать тип данных в массиве ShadowMas Программирование и базы данных 4 18-04-2009 22:26
не удается подключиться к базе данных сервера WSUS Rkiller WSUS 10 09-02-2009 17:08
MySQL - [решено] сохранение данных в базе данных Mysql TigerZaka Программирование и базы данных 4 24-08-2008 15:48
Представление файловой системы в базе данных Amina Программирование и базы данных 1 29-03-2004 14:50
Дробление табличек в базе данных x404 Программирование и базы данных 2 23-10-2003 02:21




 
Переход