П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] |
Для MySql (есть стандарт, но его, имхо, мало кто придерживается или стандартов много :)):
Код:
select A.name, A.email from users as A, ids as B where (A.name=B.name) and (B.id=5) На счет нормализации можно почитать здесь, а поисковики выдадут еще кучу статей и доков на основе тех слов которые будут вам непонятны. [s]Исправлено: Prisoner, 5:16 22-05-2004[/s] |
Да я учил всё это, но с моим объёмом и сложностью базы данных, я не стал так серьёзно подходить к делу :)
Этот вариант тоже не проходит :( В браузер выводится: Warning: mysql_fetch_row(): supplied argument is not a valid MySQL result resource - то есть запрос почему то не правильно построен Может я что с индексами начудил??? первая таблица: много информации о юзере (в том числе name, email-которые мне сейчас нужны, верней только email, так как name я уже знаю) вторая таблица: три столбца по сессии: id-уникальный номер сессии, name-имя юзера, который открыл сессию, time-время открытия сессии И вот как мне сделать подобный запрос к таким таблицам??? И ещё как правильно здесь было бы организовать индексы??? Добавлено: УУУУУУпс :gigi: у меня была одна лишняя скобка :biggrin: Поэтому ничего не работало Но в любом случае объясните, нужно ли в данной ситуации вводить индексы (сейчас у меня и без них всё работает), верней то, что нужно, я знаю, поиск намного быстрей, но самое главное как в данной ситуации организовать индексы, на каких полях и тд. И почему создатели PHP не сделали хотя простейшую проверку синтаксиса запросов mysql?? Тогда бы я полдня бы не ломал голову, хотя эо было всего лишь лишняя скобка |
1) насчет id (и всего остального - респект :) - согласна с Prisoner (соответственно, связь через id)
2) id скорее всего должен быть auto_increment и PRIMARY KEY (те генериться автоматически и быть первичным ключем - те тоже своего рода индексом) 3) я вообще предпочитаю стиль, когда свой такой id вводится в каждой таблице 4) в другой таблице надо соответственно ввести поле - что-то вроде user_id и на него посадить индекс 3) индексом стоит наградить все поля, по которым будут идти выборки, но следует иметь в виду, что при небольшом количестве записей работать они (индексы), при запросах все равно скорей всего не будут 4) Проверить что и как работает можно при помощи оператора EXPLAIN * работать у тебя будет, кстати говоря и без индексов, но при увеличении объема базы работать будет все медленнее (для того индексы в бд и существуют, чтобы по ним быстро шерстить) Кстати, в апрельском номере PHP inside опубликован перевод очень неплохой статьи "Шаблоны баз данных в MySQL" Рассела Дайера. * |
mar
id у меня не связан с юзером, id-это номер сессии, а уже в этой же таблице есть столбец name, который указывает на открывшего данную сессию пользователя |
vadimiron
я об этом и писала - подумай сам: какие поля занимают больше места? какие поля легче индексируются? наконец за уникальностью каких полей легче следить? в твоем случае проще ихмо что-то вроде: Первая таблица: Код:
CREATE TABLE users ( Код:
CREATE TABLE ids ( [s]Исправлено: mar, 20:31 23-05-2004[/s] |
Всё хорошо и красиво только у id я не смогу auto_increment поставить, так как id устанавливается функцией rand при заходе юзера, то есть я усвтанавливаю свои значения для id, auto_increment не подходит
|
vadimiron
пример сложного запроса: Код:
//чдение из базы информации о постах скорее всего проблемма не в запросе, а в самом скрипте! можеть выложить весь кусок кода? vadimiron ты не правильно понял смысл ошибки! |
Ой, а можно я тоже "сложным" запросом похвастаюсь? :) А то самокритика ведет - 333:1 :).
Код:
SELECT DISTINCT На счет проверки синтаксиса запроса нужно обращаться по адресу :). Зачем php об этом думать, если это не его задача? Другой вопрос, что он знает об ошибке последнего запроса, знает и молчит, заставит же его говорить об этом функция mysql_error(). |
Prisoner
я думаю что у vadimiron в функцию mysql_fetch_row() передается не то чно нужно! т.к. PHP выдает свою ошибку а не ошибку MySQL! |
Vlad Drakula
Сенкс, но же написал что сам запрос был неправильно составлен, то есть с лишними скобками, и естественно mysql_fetch_row() выдавал ошибку, так как не получал нормальной инфы из запроса Сейчас всё работает |
Prisoner
а что означает DISTINCT Добавлено: vadimiron дело в том что в данной задаче очень сложно определить нужны ли индексы и какие именно! если нужна оптимизация то я бы посоветовал сделать одну таблицу с тремя полями и индексом по id. на мой взгляд это будет наиболее оптимальный вариант! |
Vlad Drakula
Цитата:
|
Выбор несовпадающего... угу. Вообще говоря
Цитата:
Код:
CREATE TABLE `users` ( |
Не, у меня в голове не очень укладывается, как это всё в одну таблицу запихнуть, читсо логически: сессии-это что то очень динамическое, если юзер определённое время не был активен то есть не делал никаких действий, то сессия стирается, таким образом всё время какие то движения происходят там, что то добавляется, что то стирается, а таблица с юзерами статична, изменения редко бывают, а теперь представим, что у меня записано 1000 юзеров, и что, каждый раз придётся проверять все 1000 строк, чтобы узнать устарела ли сессия или нет
Добавлено: Верней, чтобы узнать какие сессии стирать можно а какие ещё рано |
А как ты выявляешь факт устаревании сессии? Ну пусть какой-то такой факт есть. Скажем это время - пусть сессия выделяется на 5 часов (сразу прикинь на каком типе ресурсов это окажется незаменимым :)) и факт нажатия на ссылку "выход". В любом случае перед уничтожением сессии опустоши в таблице поле этой сессии для конкретного пользователя, по той логике, что была предложена выше это означает, что сессия закрыта. Еще ко всему, каждый раз когда делаешь это опустошай (и удаляй сессии PHP) поле сессий которые зарегестрированы более 5ти часов назад. Для этого достаточно выполнить всего два запроса.
Для шага (а) Код:
UPDATE `users` SET `s_id` = '' WHERE `u_id` = какой_то_там Код:
UPDATE `users` SET `s_id` = '' WHERE `s_init_time` < (CURRENT_TIMESTAMP() - 18000) |
Время: 12:18. |
Время: 12:18.
© OSzone.net 2001-