IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Веб-программирование (https://www.imho.ws/forumdisplay.php?f=29)
-   -   Два вопроса по MYSQL (https://www.imho.ws/showthread.php?t=66313)

Psionic Vision 15.08.2004 03:41

Два вопроса по MYSQL
 
1. Как узнать, сколько queries было запущено на данной странице?
2. Если я хочу сделать выборку инфы из одной таблицы, но упорядочить по качеству значения из другой таблицы возможно ли это? Пояснение:

$DB_site->query("SELECT * FROM portal_articles ORDER BY ----TUT PROBLEMA ----")

В таблице есть столбик sectionid

Есть таблица portal_sections со столбиками sectionid, sectiontitle.
Так вот, можно ли использую только тот первый query упорядочить результат по sectiontitle из второй таблицы?

RaZEr 15.08.2004 06:11

Цитата:

Как узнать, сколько queries было запущено на данной странице?
Проще всего заменить mysql_query на my_mysql_query и внутри реализовать инкремент глобальной переменной.
Цитата:

Если я хочу сделать выборку инфы из одной таблицы, но упорядочить по качеству значения из другой таблицы возможно ли это?
Толком не понял что ты хочешь, но думаю ты имеешь ввиду LEFT JOIN.

EvroStandart 15.08.2004 13:12

Цитата:

Neo:
2. Если я хочу сделать выборку инфы из одной таблицы, но упорядочить по качеству значения из другой таблицы возможно ли это? Пояснение:

Выбираеш поля из двух таблиц и устанавливаеш порядок по любому из выбранных полей.

Psionic Vision 15.08.2004 16:33

SamJa
Примерчик плз.
Как я могу выбрать поля их ДВУХ таблиц?

И где я могу почитать про LEFT JOIN?

Merlin Cori 15.08.2004 17:36

Наверное здесь
_http://www.mysql.ru/docs/man/LEFT_JOIN_optimisation.html

RaZEr 15.08.2004 17:36

Цитата:

И где я могу почитать про LEFT JOIN?
mysql.org

Psionic Vision 15.08.2004 22:16

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

is_absent 15.08.2004 22:58

$DB_site->query("SELECT pa.* FROM portal_articles pa, portal_sections ps WHERE pa.sectionid = ps.sectionid ORDER BY ps.sectiontitle")

Psionic Vision 16.08.2004 02:24

is_absent
А с пошаговым объяснением?
Что делает точка? Почему portal_articles pa - почему там пробел? Что такое через запятую?

Выбрать столбик pa из portal_articles и ps из portal_sections?
Но что за звездочка?

Новый вопрос:
какое среднее допустимое колво query на одну страницу (я понимаю, что чем меньше тем лучше).

Psionic Vision 16.08.2004 05:41

Что такое 'pa' и что такое 'ps'??

is_absent 16.08.2004 06:56

Neo
pa.* -- выбрать все поля из таблички pa
pa и ps -- альясы (короткие имена) для таблиц, чтобы не писать их полностью.
среднее число запросов... вообще рекомендуемое время ответа сервера в браузер (в какой-то книжке прочитал, кажется "Не заставляйте меня думать") 1 -3 секунды. вот и считай :) укладываешься -- замечательно. нет -- оптимизируй запросы

EvroStandart 16.08.2004 12:55

Цитата:

Neo:
Что делает точка? Почему portal_articles pa - почему там пробел? Что такое через запятую?
Точка - разделитель имени таблицы от имени поля. user.name, user.addr
portal_articles pa - это полное имя и сокращение (альяс).
Через запятую пишутся имена полей или именя таблиц.

Psionic Vision 16.08.2004 18:25

То есть,
запрос

Цитата:

$DB_site->query("SELECT pa.* FROM portal_articles pa, portal_sections ps WHERE pa.sectionid = ps.sectionid ORDER BY ps.sectiontitle")
Выбирает все поля из таблицы pa, но сравнивает их с таблицей ps и берет только те, где одинаковые sectionid, а затем сортирует их по sectiontitle из второй таблицы??

Хм. Это не совсем то. А что если мне надо следующее:

Выбрать всю инфу из таблицы portal_articles, но в результат вложить также user.username и user.realname?

А что если сделать так:
SELECT pa.*,user.username,user.realname FROM portal_articles pa, user ORDER BY pa.patitle?

Это будет работать как ожидается? Т.е. мне нужно, чтобы поля из таблицы user Добавлялись только к тем строкам, которые совпали с условием, но чтобы лишние строки из таблицы user не выбирались?

Psionic Vision 16.08.2004 19:37

Да, вроде работает. Правда немножно измененно. так что, на все, что до этой строки, можете не отвечать.

Кое что посложнее:
Если я хочу дать запрос, который выдаст мне список всех portal_articles и portal_sections.sectiontitle WHERE ps.sectionid = pa.sectionid?
Так, чтобы:
в $result[data] были portal_articles, а в $result[sectiontitle] было sections.sectiontitle.
Наверное, это уже невозможно?

Т.е. как совместить следующие два запроса:

$result[data] = $DB_site->query("SELECT * FROM portal_articles WHERE groupid='".$groupid."'");
$result[title] = $DB_site->query("SELECT grouptitle FROM portal_groups WHERE groupid='".$groupid."'");

Да, кстати. С помощью предыдущей инфы я оптимизировал мой сайт на 2 запроса :))))

is_absent 16.08.2004 19:53

Neo
$DB_site->query("SELECT pa.*, grouptitle FROM portal_articles pa, portal_groups pg WHERE pg.groupid=pa.groupid and pa.groupid='".$groupid."'");
по нужным массивам и сам разложишь :)

Можно совет? Купи себе Дейта "Основы баз данных". Очень помогает, при решении подобных проблем. По собственному опыту знаю. Изучал базы данных с него. Еще с третьего издания. Сейчас должно быть седьмое (или восьмое).

Psionic Vision 16.08.2004 20:53

is_absent
Цитата:

$DB_site->query("SELECT pa.*, grouptitle FROM portal_articles pa, portal_groups pg WHERE pg.groupid=pa.groupid and pa.groupid='".$groupid."'");
по нужным массивам и сам разложишь
Нет, ты не понял. Как же я разложу, если pa.* - это много rows, а grouptitle - это только один row? Или, для каждого pa.* это значение высчитывается заново?


Цитата:

Можно совет? Купи себе Дейта "Основы баз данных". Очень помогает, при решении подобных проблем. По собственному опыту знаю. Изучал базы данных с него. Еще с третьего издания. Сейчас должно быть седьмое (или восьмое).
Хорошо :)

is_absent 17.08.2004 06:40

Цитата:

Neo:
Нет, ты не понял. Как же я разложу, если pa.* - это много rows, а grouptitle - это только один row? Или, для каждого pa.* это значение высчитывается заново?
Да, будет высчитываться заново.

Psionic Vision 17.08.2004 16:01

is_absent
Хм... понятно.
Значит, сделать один запрос так, чтобы он вывел часть результата в одно место, а часть в другое - нельзя?

Psionic Vision 17.08.2004 23:35

Итак, это:

$result = mysql_fetch_assoc($DB_site->query("SELECT pa.*,user.username FROM portal_articles pa, user WHERE user.userid = pa.userid ORDER BY pa.articleid DESC LIMIT 1"))

Не совсем так работает, как хотелось бы.
Допустим, у меня в базе статья с пользователем у которого ID - '-1' - т.е. без пользователя. В результате данного запроса, такие статьи просто пропускаются. А как сделать чтобы они не пропускались, а выводили для поля user значение "NaN"?

Т.е, чтобы результат был в таких случаях примерно такой:
$result {
[articleid] => int "1",
[pagetext] => string(12) "Pagetext....",
[userid] => string(2) "-1",
[username] => string(3) "NaN",
}

Это все можно сделать, запрашивая для каждого article отдельно инфу о юзере. Но это - дополнительный запрос... Хотелось бы избежать.
Помогите пожалуйста.
Спасибо,
Neo

Sheryld 18.08.2004 09:34

странно ты как то делаешь...

обычно:

$res = mysql_query

//проверка (например на кол-во возвращенным записей)

while($row = mysql_fetch_assoc($res))
{
//обработка $row <- ассоциативный массив
}

is_absent 18.08.2004 22:41

Цитата:

Neo:
Допустим, у меня в базе статья с пользователем у которого ID - '-1' - т.е. без пользователя. В результате данного запроса, такие статьи просто пропускаются. А как сделать чтобы они не пропускались, а выводили для поля user значение "NaN"?
Почитай про left join, уже давали ссылочку :) как раз оно и есть.

Psionic Vision 19.08.2004 18:08

Хорошо.
Так что же лучше?

$DB_site->query("SELECT sectiontitle FROM sections WHERE secid=$secid");
$DB_site->query("SELECT * FROM articles WHERE secid=$secid");

или

$DB_site->query("SELECT s.sectiontitle, a.* FROM sections s,articles a WHERE s.secid=a.secid AND s.secid=$secid");

?

А про left join я щас почитаю еще раз.
Хотя в прошлый раз я так ничего и не понял :(

Вроде понял.

$result = $DB_site->query("SELECT na.* FROM neolit_articles na LEFT JOIN user ON (user.userid=na.userid) WHERE na.secid='18'");

но, это не возвращает поле user.username....... как его туда добавить?

is_absent 20.08.2004 06:05

select na.*, user.username.....

Psionic Vision 20.08.2004 16:11

is_absent
Спасибо.
Все получилось. :)


Часовой пояс GMT +4, время: 15:38.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.