|
Компьютерный форум OSzone.net » Компьютеры + Интернет » Вебмастеру » Научите меня правильно строить сложные запросы к базе данных |
|
|
Научите меня правильно строить сложные запросы к базе данных
|
Ветеран Сообщения: 1864 |
Профиль | Отправить 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] |
|
------- Отправлено: 00:25, 22-05-2004 |
Engrossed by the Void Сообщения: 2229
|
Профиль | Отправить PM | Цитировать Для MySql (есть стандарт, но его, имхо, мало кто придерживается или стандартов много ):
На счет запросов понятно... непонятна организация данных. ID это уникальный номер пользователя? Тогда вторая таблица вообще не нужна, вторая таблица в большинстве таких случаев необходима для связи "1-n" - один ко многим. К примеру нужно хранить права конкретного человека на редактирование тех или иных частей сайта, файло или еще чего. То есть таких "еще чего" - много, вот и получается связь один ко многим. Вообще существует механизм (математический) по построению БД. Надо проанализировать рабочую область данных, выявить сущности (объекты области, скажем пользователь, страница и т. д.) ее атрибуты (они в последствии станут полями), связи (связи в последствии могут стать отдельными таблицами в зависимости от вида связи), построить ER-диаграмму (часто опционально, но жутко полезно), потом провести проверку на Нормальные Формы: 1НФ, 2НФ, 3НФ и "иногда" НФ Бойса-Кодда. В общем это надо до создания работать еще, правда на не сложных БД можно сделать все и так - просто интуитивно ясно где и как организовать таблицы и их поля, интуитивно избегнуть избыточности и интуитивно же понять где избыточность компенсируется быстродейсвием. На счет нормализации можно почитать здесь, а поисковики выдадут еще кучу статей и доков на основе тех слов которые будут вам непонятны. [s]Исправлено: Prisoner, 5:16 22-05-2004[/s] |
------- Отправлено: 05:14, 22-05-2004 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1864
|
Профиль | Отправить PM | Цитировать Да я учил всё это, но с моим объёмом и сложностью базы данных, я не стал так серьёзно подходить к делу
Этот вариант тоже не проходит В браузер выводится: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource - то есть запрос почему то не правильно построен Может я что с индексами начудил??? первая таблица: много информации о юзере (в том числе name, email-которые мне сейчас нужны, верней только email, так как name я уже знаю) вторая таблица: три столбца по сессии: id-уникальный номер сессии, name-имя юзера, который открыл сессию, time-время открытия сессии И вот как мне сделать подобный запрос к таким таблицам??? И ещё как правильно здесь было бы организовать индексы??? Добавлено: УУУУУУпс у меня была одна лишняя скобка Поэтому ничего не работало Но в любом случае объясните, нужно ли в данной ситуации вводить индексы (сейчас у меня и без них всё работает), верней то, что нужно, я знаю, поиск намного быстрей, но самое главное как в данной ситуации организовать индексы, на каких полях и тд. И почему создатели PHP не сделали хотя простейшую проверку синтаксиса запросов mysql?? Тогда бы я полдня бы не ломал голову, хотя эо было всего лишь лишняя скобка |
------- Отправлено: 13:36, 22-05-2004 | #3 |
just mar Сообщения: 3904
|
Профиль | Отправить 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 |
Ветеран Сообщения: 1864
|
Профиль | Отправить PM | Цитировать mar
id у меня не связан с юзером, id-это номер сессии, а уже в этой же таблице есть столбец name, который указывает на открывшего данную сессию пользователя |
|
------- Отправлено: 01:54, 23-05-2004 | #5 |
just mar Сообщения: 3904
|
Профиль | Отправить 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 |
Ветеран Сообщения: 1864
|
Профиль | Отправить PM | Цитировать Всё хорошо и красиво только у id я не смогу auto_increment поставить, так как id устанавливается функцией rand при заходе юзера, то есть я усвтанавливаю свои значения для id, auto_increment не подходит
|
------- Отправлено: 02:07, 24-05-2004 | #7 |
Ночной странник Сообщения: 4050
|
Профиль | Сайт | Отправить 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 ты не правильно понял смысл ошибки! |
------- Отправлено: 22:06, 26-05-2004 | #8 |
Engrossed by the Void Сообщения: 2229
|
Профиль | Отправить 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 |
Ночной странник Сообщения: 4050
|
Профиль | Сайт | Отправить PM | Цитировать Prisoner
я думаю что у vadimiron в функцию mysql_fetch_row() передается не то чно нужно! т.к. PHP выдает свою ошибку а не ошибку MySQL! |
------- Отправлено: 02:24, 29-05-2004 | #10 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|