Начинаю знакомиться с базами данных. И на первых порах столкнулся с проблемой – не могу сообразить как лучше спланировать базу.
До этого, в качестве базы данных пользовался текстовыми документами. Как то проще все было. Но теперь база слишком большая и иногда проявляются ошибки при добавлении или удалении пользователя.
Задача заключается в следующем –
Есть таблица с пользователями
Id | name | date | rank | city | ……
21 | user | 11/06/1981 | 11 | Саратов | ……
51 | user2 | 09/05/1975 | 15 | Москва | ……
Таблица со званиями
Id | rank | ……
11| рядовой |
И еще куча таблиц – награды и т.п.
Так вот – необходимо записывать и выводить для каждого пользователя определенные заметки –
Звания
Пр.
12.06.07 – присвоено звание ……….
12.06.08 – присвоено очередное звание ……….
В таком же формате награды, взыскания и т.д.
Как лучше построить подобную таблицу. Очень большое количество пользователей и хочется что бы сайт работал быстрее.
Может создать таблицу и в одну ячейку забивать все заметки для отдельного пользователя, тогда как выводить или редактировать? Создавать отдельную таблицу для каждого пользователя? Это жестоко, по моему. На каждую запись вешать ид пользователя(не будет ли подтормаживать такой способ загрузку странички?)?
Помогите советом!

Спустя 7 минут, 39 секунд (28.06.2008 - 20:41) Niemand написал(а):
для всей информации, которой может быть больше, чем 1 (как в твоем примере ранги) делаешь свою таблицу...
Т.е. в твоем случае 3: Пользователи, Ранги (для возможности пополнения и изменения), Присвоения рангов (для связи одного с другим).
Присвоение рангов получается таким:
Айди (id)/ Пользователь( user_num) / Дата присвоения (pr_date) / Номер ранга (rank_nr)
у тебя получается к примеру
Id | name | date | rank | city | ……
21 | user | 11/06/1981 | 11 | Саратов | ……
51 | user2 | 09/05/1975 | 15 | Москва | ……
Id | rank | ……
1| рядовой | ...
2| сержант | ...
id / user_num / pr_date / rank_nr
1 / 21 / 28.05.08 / 1
2 / 51 / 20.06.08 / 2
при вызове информации связываешь с помощью 3ей таблицы 1ю и 2ю между собой... если с базой знаком совсем плохо, вместо rank_nr записывай сами названия рангов, тогда тебе для вывода информации по присвоению рангов не нужно будет использовать другие таблицы.
Т.е. в твоем случае 3: Пользователи, Ранги (для возможности пополнения и изменения), Присвоения рангов (для связи одного с другим).
Присвоение рангов получается таким:
Айди (id)/ Пользователь( user_num) / Дата присвоения (pr_date) / Номер ранга (rank_nr)
у тебя получается к примеру
Id | name | date | rank | city | ……
21 | user | 11/06/1981 | 11 | Саратов | ……
51 | user2 | 09/05/1975 | 15 | Москва | ……
Id | rank | ……
1| рядовой | ...
2| сержант | ...
id / user_num / pr_date / rank_nr
1 / 21 / 28.05.08 / 1
2 / 51 / 20.06.08 / 2
при вызове информации связываешь с помощью 3ей таблицы 1ю и 2ю между собой... если с базой знаком совсем плохо, вместо rank_nr записывай сами названия рангов, тогда тебе для вывода информации по присвоению рангов не нужно будет использовать другие таблицы.
Спустя 19 минут, 15 секунд (28.06.2008 - 21:00) Shurick написал(а):
у меня в таблице званий прописаны еще адреса картики погон. да и к тому же при помощи званий я сортировал пользователей...
Вообщем лучше создавать таблицу для отдельных записей и вешать на них ид пользователя?
Тут еще одна проблема ---
Есть страничка личного состава.
Пр.
Штабная эскадрилья
user1
user2
1-я эскадрилья
Командир - user1
Зам. Ком. - user3
Пилот - user4
Пилот - user5
Пилот - user6
2-я эскадрилья
Пилот - Командир - User2
Зам. Ком. - User7
Пилот - User8
Пилот - User9
Пилот - User10
Пилот - User10
В текстовых документах я создавал основной документ, в нем перечень всех отделов.
Id | name
234 | штабная
456 | 1-я эскадрилья
789| 2-я эскадрилья
Далее шел в директорию division где лежат документы с соответствующими иду именами -234.txt, 456.txt, 789.txt. В каждом из них перечислены ид занимаемой должности, иды пользователей и занимаемые должности.
Как это реализовать в базе данных? Вешать на пользователя ид занимаемой должности я не могу. Один пользователь может занимать несколько должностей. Да и отделы постоянно меняются.
Создать таблицу с перечнем отделов. И в одной из ячеек перечислить иды пользователей и должность, но как потом редактировать, удалять и добавлять – этот способ мне кажется не пойдет, а на другое что то у меня не хватает воображения, или лучше сказать опыта.
Вообщем лучше создавать таблицу для отдельных записей и вешать на них ид пользователя?
Тут еще одна проблема ---
Есть страничка личного состава.
Пр.
Штабная эскадрилья
user1
user2
1-я эскадрилья
Командир - user1
Зам. Ком. - user3
Пилот - user4
Пилот - user5
Пилот - user6
2-я эскадрилья
Пилот - Командир - User2
Зам. Ком. - User7
Пилот - User8
Пилот - User9
Пилот - User10
Пилот - User10
В текстовых документах я создавал основной документ, в нем перечень всех отделов.
Id | name
234 | штабная
456 | 1-я эскадрилья
789| 2-я эскадрилья
Далее шел в директорию division где лежат документы с соответствующими иду именами -234.txt, 456.txt, 789.txt. В каждом из них перечислены ид занимаемой должности, иды пользователей и занимаемые должности.
Как это реализовать в базе данных? Вешать на пользователя ид занимаемой должности я не могу. Один пользователь может занимать несколько должностей. Да и отделы постоянно меняются.
Создать таблицу с перечнем отделов. И в одной из ячеек перечислить иды пользователей и должность, но как потом редактировать, удалять и добавлять – этот способ мне кажется не пойдет, а на другое что то у меня не хватает воображения, или лучше сказать опыта.
Спустя 24 минуты, 50 секунд (28.06.2008 - 21:25) Niemand написал(а):
Цитата(Shurick @ 28.6.2008, 22:00) [snapback]41617[/snapback]
Вообщем лучше создавать таблицу для отдельных записей и вешать на них ид пользователя?
да, и потом связывать таблицы с помощью LEFT JOIN
Цитата(Shurick @ 28.6.2008, 22:00) [snapback]41617[/snapback]
В текстовых документах я создавал основной документ, в нем перечень всех отделов.
Id | name
234 | штабная
456 | 1-я эскадрилья
789| 2-я эскадрилья
Далее шел в директорию division где лежат документы с соответствующими иду именами -234.txt, 456.txt, 789.txt. В каждом из них перечислены ид занимаемой должности, иды пользователей и занимаемые должности.
Как это реализовать в базе данных? Вешать на пользователя ид занимаемой должности я не могу. Один пользователь может занимать несколько должностей. Да и отделы постоянно меняются.
Создать таблицу с перечнем отделов. И в одной из ячеек перечислить иды пользователей и должность, но как потом редактировать, удалять и добавлять – этот способ мне кажется не пойдет, а на другое что то у меня не хватает воображения, или лучше сказать опыта.
Id | name
234 | штабная
456 | 1-я эскадрилья
789| 2-я эскадрилья
Далее шел в директорию division где лежат документы с соответствующими иду именами -234.txt, 456.txt, 789.txt. В каждом из них перечислены ид занимаемой должности, иды пользователей и занимаемые должности.
Как это реализовать в базе данных? Вешать на пользователя ид занимаемой должности я не могу. Один пользователь может занимать несколько должностей. Да и отделы постоянно меняются.
Создать таблицу с перечнем отделов. И в одной из ячеек перечислить иды пользователей и должность, но как потом редактировать, удалять и добавлять – этот способ мне кажется не пойдет, а на другое что то у меня не хватает воображения, или лучше сказать опыта.
Я бы сделал таблицу Эскадрильи, в которой бы сохранял названия и айди отделов + таблицу в которой бы указывал айди отдела, айди пользователя и его должность.
Спустя 2 часа, 54 минуты, 18 секунд (29.06.2008 - 00:20) Shurick написал(а):
Цитата(Niemand @ 28.6.2008, 18:25) [snapback]41618[/snapback]
да, и потом связывать таблицы с помощью LEFT JOIN
Это КАК?!

Спустя 2 часа, 34 минуты, 24 секунды (29.06.2008 - 02:54) Shurick написал(а):
Чет не получается замутить сравнение так как в текстовых документах...
В одной таблице у меня пользователи, в другой звания. В таблице пользователей есть ячейка rank. В ней записаны числовые значения. Они соответствуют идам в таблицы званий.
Пытаюсь c помощью if сравнить данные и присвоить $rank значение, но чет не получается нифига.
if ($row["rank"] == $rowa["id"]) {
$rank = $rowa["rank"];
}
Или с базой так не прокатит?
В одной таблице у меня пользователи, в другой звания. В таблице пользователей есть ячейка rank. В ней записаны числовые значения. Они соответствуют идам в таблицы званий.
Пытаюсь c помощью if сравнить данные и присвоить $rank значение, но чет не получается нифига.
if ($row["rank"] == $rowa["id"]) {
$rank = $rowa["rank"];
}
Или с базой так не прокатит?
Спустя 1 час, 23 минуты, 32 секунды (29.06.2008 - 04:17) Alchemist написал(а):
Не совсем понятно, что ты тут делаешь...
Спустя 6 часов, 57 минут, 8 секунд (29.06.2008 - 11:15) Niemand написал(а):
- почитай про JOIN в документации MySQL.
- с базой так не прокатит... если с join не разберешься, есть еще способ, более громоздкий: считываешь айди из базы пользователей, потом НОВЫМ запросом ищешь название ранга в базе
- с базой так не прокатит... если с join не разберешься, есть еще способ, более громоздкий: считываешь айди из базы пользователей, потом НОВЫМ запросом ищешь название ранга в базе
Спустя 1 час, 32 минуты, 52 секунды (29.06.2008 - 12:47) Shurick написал(а):
Вот чего то состряпал:
SELECT * FROM users LEFT JOIN use_rank ON users.id=use_rank.id;
Получилось!
Но теперь чет не могу понять как двигаться дальше ----
$connection = mysql_connect($dbhost, $dbuser, $dbpass);
$SelectedDB = mysql_select_db($dbname);
$result = mysql_query("SELECT * FROM users LEFT JOIN use_rank ON users.rank=use_rank.id;");
while ($row = mysql_fetch_array($result)) {
print "<tr>";
print " <td width=\"20%\">";
print " <div align=\"left\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">";
print $row["cal"];
print " </font></div>";
print " </td>";
print " <td width=\"25%\">";
print " <div align=\"center\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">".$row["rank"]."</font></div>";
print " </td>";
print " <td width=\"25%\">";
print " <div align=\"center\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">".$row["fio"]."</font></div>";
print " </td>";
print " <td width=\"15%\">";
print " <div align=\"center\"><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">".($row["bort"])."</font></div>";
print " </td>";
print " <td width=\"15%\">";
print " <div align=\"center\"><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">".ПОГОН."</font></div>";
print " </td>";
print "</tr>";
}
Я то присвоил пользователю звание посредством сравнения таблиц, но в той же таблице званий в третей ячейке лежит ссылка на картинку погона, которую мне нужно вывести в таблицу. Я ща конечно обмозгую это дело. Было бы здорово если кто нить дал напутствие...
SELECT * FROM users LEFT JOIN use_rank ON users.id=use_rank.id;
Получилось!
Но теперь чет не могу понять как двигаться дальше ----
$connection = mysql_connect($dbhost, $dbuser, $dbpass);
$SelectedDB = mysql_select_db($dbname);
$result = mysql_query("SELECT * FROM users LEFT JOIN use_rank ON users.rank=use_rank.id;");
while ($row = mysql_fetch_array($result)) {
print "<tr>";
print " <td width=\"20%\">";
print " <div align=\"left\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">";
print $row["cal"];
print " </font></div>";
print " </td>";
print " <td width=\"25%\">";
print " <div align=\"center\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">".$row["rank"]."</font></div>";
print " </td>";
print " <td width=\"25%\">";
print " <div align=\"center\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">".$row["fio"]."</font></div>";
print " </td>";
print " <td width=\"15%\">";
print " <div align=\"center\"><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">".($row["bort"])."</font></div>";
print " </td>";
print " <td width=\"15%\">";
print " <div align=\"center\"><font size=\"1\" face=\"Verdana, Arial, Helvetica, sans-serif\">".ПОГОН."</font></div>";
print " </td>";
print "</tr>";
}
Я то присвоил пользователю звание посредством сравнения таблиц, но в той же таблице званий в третей ячейке лежит ссылка на картинку погона, которую мне нужно вывести в таблицу. Я ща конечно обмозгую это дело. Было бы здорово если кто нить дал напутствие...
Спустя 10 минут, 12 секунд (29.06.2008 - 12:58) Shurick написал(а):
Ага! Вроде как нашел! Просто вставляю $row["img"]. Здорово! Теперь таблицы полностью связаны!
Может не так все тяжело как казалось! Главное хороший совет! Niemand Спасибо ТЕБЕ!
Может не так все тяжело как казалось! Главное хороший совет! Niemand Спасибо ТЕБЕ!
Спустя 56 минут, 26 секунд (29.06.2008 - 13:54) Niemand написал(а):
не за что. только не обязательно писать каждую строку через print. можно один раз открыть кавычки, написать весь хтмл (прерывая на том месте, куда вставляется пхп), в конце закрыть
примерно так. удачи =)
Код
while ($row = mysql_fetch_array($result)) {
print " <div align=\"left\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">
".$row["cal"]."
</font></div>
";
}
print " <div align=\"left\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">
".$row["cal"]."
</font></div>
";
}
примерно так. удачи =)
Спустя 24 минуты, 57 секунд (29.06.2008 - 14:19) Shurick написал(а):

Спустя 13 часов, 6 минут, 22 секунды (30.06.2008 - 03:25) Shurick написал(а):
Брррррр....
Чего то я совсем запутался. Не могу добиться желаемого результата! Взял скрипт форума как приме, дабы разобраться. Но что то не выходит вникнуть.
Соединяю три таблицы.
Первая - отделы
Вторая - иды отделов и пользователи относящиеся к определенному отделу
Третья – пользователи
$connection = mysql_connect($dbhost, $dbuser, $dbpass);
$SelectedDB = mysql_select_db($dbname);
$result = mysql_query("SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.div_id)
LEFT JOIN users ON (division_user.us_id=users.id)
");
while ($row = mysql_fetch_array($result)) {
print " <td width=\"20%\">";
print " <div align=\"left\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">";
print $row["dname"];
print " </br>";
print $row["cal"];
print " </font></div>";
print " </td>";
print "</tr>";
}
Эскадрилья управления
User2
1-ая истребительная
User3
1-ая истребительная
User4
2-ая Гвардейска
User5
2-ая Гвардейска
User6
А хотелось бы вот так :
Эскадрилья управления
User1
User2
1-ая истребительная
User3
User4
2-ая Гвардейска
User5
User6
Что же не так?!
Чего то я совсем запутался. Не могу добиться желаемого результата! Взял скрипт форума как приме, дабы разобраться. Но что то не выходит вникнуть.
Соединяю три таблицы.
Первая - отделы
Вторая - иды отделов и пользователи относящиеся к определенному отделу
Третья – пользователи
$connection = mysql_connect($dbhost, $dbuser, $dbpass);
$SelectedDB = mysql_select_db($dbname);
$result = mysql_query("SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.div_id)
LEFT JOIN users ON (division_user.us_id=users.id)
");
while ($row = mysql_fetch_array($result)) {
print " <td width=\"20%\">";
print " <div align=\"left\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\">";
print $row["dname"];
print " </br>";
print $row["cal"];
print " </font></div>";
print " </td>";
print "</tr>";
}
Эскадрилья управления
User2
1-ая истребительная
User3
1-ая истребительная
User4
2-ая Гвардейска
User5
2-ая Гвардейска
User6
А хотелось бы вот так :
Эскадрилья управления
User1
User2
1-ая истребительная
User3
User4
2-ая Гвардейска
User5
User6
Что же не так?!

Спустя 8 часов, 57 минут, 39 секунд (30.06.2008 - 12:23) Shurick написал(а):
Помогите плиз! Обошел весь форум не нашел ничего подобного... Заню что ТУПЛЮ!
Спустя 1 час, 26 минут, 56 секунд (30.06.2008 - 13:50) Alchemist написал(а):
Все так... SQL запрос возвращает полную таблицу. Т.е. у тебя в каждой строке есть ВСЕ поля.
Спустя 7 минут, 52 секунды (30.06.2008 - 13:58) Shurick написал(а):
Цитата(Alchemist @ 30.6.2008, 10:50) [snapback]41760[/snapback]
в каждой строке есть ВСЕ поля.
Это дааа... Но чет как то из воздуха не получается придумать. Метод тыка Рулеззз, но он мне не сильно помог. Продолжаю поиски по форуму.
Спустя 3 часа, 25 минут, 1 секунда (30.06.2008 - 17:23) Alchemist написал(а):
не совсем понял что ты ищешь (да еще методом тыка), и в чем именно тебе нужна помощь...
сделать так, чтобы возвращалась не полная таблица ? так не бывает. JOIN'утые таблицы всегда соединяются по принципу "строка - строка"... Даже если в случае LEFT JOIN'a в таблице нет подходящей строки - все равно, в результате будут присутствовать все запрошеные поля, просто недостающие будут заполнены NULL'ами.
Самый простой(ИМХО) способ напечатать данные так как тебе хочется - это делать все в два этапа.
Первый - выборка данных из БД и сортировка.
Второй - печать.
В твоем примере можно написать что-то вроде:
Это универсальное решение. Так можно сортировать данные по множеству параметров, создавать многомерные массивы, объекты и вообще подготавливать данные к наиболее удобному использованию.
Впрочем если все что надо вытащить - это одно поле сгруппированое по другому (или другим), то MySQL предоставляет интересную функцию GROUP_CONCAT().
Она может вытащить и несколько полей (если очень хочется), но тогда надо думать, как их потом разъединить.
сделать так, чтобы возвращалась не полная таблица ? так не бывает. JOIN'утые таблицы всегда соединяются по принципу "строка - строка"... Даже если в случае LEFT JOIN'a в таблице нет подходящей строки - все равно, в результате будут присутствовать все запрошеные поля, просто недостающие будут заполнены NULL'ами.
Самый простой(ИМХО) способ напечатать данные так как тебе хочется - это делать все в два этапа.
Первый - выборка данных из БД и сортировка.
Второй - печать.
В твоем примере можно написать что-то вроде:
Код
$table = array();
while ($row = mysql_fetch_array($result)) {
$table[$row['dname']][] = $row['cal'];
}
foreach($table as $division => $people){
echo $division."<br>";
for($i=0; $i<count($people); $i++){
echo $people[$i]."<br>";
}
}
while ($row = mysql_fetch_array($result)) {
$table[$row['dname']][] = $row['cal'];
}
foreach($table as $division => $people){
echo $division."<br>";
for($i=0; $i<count($people); $i++){
echo $people[$i]."<br>";
}
}
Это универсальное решение. Так можно сортировать данные по множеству параметров, создавать многомерные массивы, объекты и вообще подготавливать данные к наиболее удобному использованию.
Впрочем если все что надо вытащить - это одно поле сгруппированое по другому (или другим), то MySQL предоставляет интересную функцию GROUP_CONCAT().
Она может вытащить и несколько полей (если очень хочется), но тогда надо думать, как их потом разъединить.
Спустя 55 минут, 53 секунды (30.06.2008 - 18:19) Shurick написал(а):
Вот есть же хорошие люди!
Все получилось! Единственное хотел получить бы совет - не будет ли тормозов при таком раскладе:

Все получилось! Единственное хотел получить бы совет - не будет ли тормозов при таком раскладе:
Код |
$connection = mysql_connect($dbhost, $dbuser, $dbpass); $SelectedDB = mysql_select_db($dbname); $result = mysql_query("SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.div_id) LEFT JOIN users ON (division_user.us_id=users.id) LEFT JOIN use_rank ON (users.rank=use_rank.rid) "); $table = array(); while ($row = mysql_fetch_array($result)) { $table[$row['dname']][] = $row['us_id']; } foreach($table as $division => $people){ echo $division."<br>"; for($i=0; $i<count($people); $i++){ $result = mysql_query("SELECT * FROM division_user LEFT JOIN users ON (division_user.us_id=users.id) LEFT JOIN use_rank ON (users.rank=use_rank.rid) WHERE users.id=".$people[$i].""); while ($row = mysql_fetch_array($result)) { echo $row['cal']." "; echo $row['post']." "; echo $row['rank']." "; echo $row['name']." "; echo $row['bort']." "; echo "</br>"; }}} |
Результат:
Код |
Эскадрилья управления User1 Командир Ст. лейтенант Александр 17 User2 Зам. Ком. Мл. лейтенант Виталий 21 1-ая истребительная User3 Пилот Капитан Владимир 2 User4 Пилот Майор Евгений 55 2-ая Гвардейская User5 Пилот Ст. лейтенант Владимир 65 User6 Пилот Генерал-лейтена Сергей 10 |
Спустя 21 минута, 52 секунды (30.06.2008 - 18:41) Alchemist написал(а):
Тормозов в прямом смысле этого слова не будет (если у тебя не миллионные таблицы), но скрипт написан нерационально.
На мой взгляд, единственным допустимым случаем занесения mysql_query() в цикл является множественный апдейт, да и то, тут в одном из соседних топиков есть рекомендация как этого избежать. Во всех остальных случаях, функция может и должна вызываться вне цикла.
В твоем примере, тебе вообще кроме первого запроса ничего не надо. Ты же в нем уже вытаскиваешь все данные нужные тебе дальше. Все остальные запросы у тебя просто частями дублируют первый.
Замени строку:
$table[$row['dname']][] = $row['us_id'];
на
$table[$row['dname']][] = $row;
а внутри for() убери запрос с while()'ом и вместо них вставь строку:
$row = $people[$i];
На мой взгляд, единственным допустимым случаем занесения mysql_query() в цикл является множественный апдейт, да и то, тут в одном из соседних топиков есть рекомендация как этого избежать. Во всех остальных случаях, функция может и должна вызываться вне цикла.
В твоем примере, тебе вообще кроме первого запроса ничего не надо. Ты же в нем уже вытаскиваешь все данные нужные тебе дальше. Все остальные запросы у тебя просто частями дублируют первый.
Замени строку:
$table[$row['dname']][] = $row['us_id'];
на
$table[$row['dname']][] = $row;
а внутри for() убери запрос с while()'ом и вместо них вставь строку:
$row = $people[$i];
Спустя 8 минут, 9 секунд (30.06.2008 - 18:49) Shurick написал(а):
Да, так попроще будет...
ОГОРМНОЕ СПАСИБО!
ОГОРМНОЕ СПАСИБО!
Спустя 2 дня, 10 часов, 12 минут, 55 секунд (3.07.2008 - 05:02) Shurick написал(а):
Цитата(Alchemist @ 30.6.2008, 14:23) [snapback]41785[/snapback]
В твоем примере можно написать что-то вроде:
Код
$table = array();
while ($row = mysql_fetch_array($result)) {
$table[$row['dname']][] = $row['cal'];
}
foreach($table as $division => $people){
echo $division."<br>";
for($i=0; $i<count($people); $i++){
echo $people[$i]."<br>";
}
}
while ($row = mysql_fetch_array($result)) {
$table[$row['dname']][] = $row['cal'];
}
foreach($table as $division => $people){
echo $division."<br>";
for($i=0; $i<count($people); $i++){
echo $people[$i]."<br>";
}
}
Использую данный скрипт. Но появилась проблема - ни как не могу разобраться.
Пробовал использовать две таблицы, пытался замутить как то через многомерный массив...
Цель заключается в том что бы вывести заметки пользователя (Звания, Назначения, Взыскания....)
На страничку нужно вывести заголовки заметок, даже если их в данный момент нет.
Хотелось бы получить следующий вариант:
================================================
Звания
================================================
Награды и поощрения
4.07.2008 Награжден 56ИП
================================================
Взыскание
================================================
Назначение и по
4.07.2008 Назначен на должность 56ИП
================================================
А при использовании вышеуказанного скрипта заголовок не выводиться если нет записей.
Получается примерно так:
================================================
Награды и поощрения
4.07.2008 Награжден 56ИП
================================================
Назначение и по
4.07.2008 Назначен на должность 56ИП
================================================
Пытался использовать две таблицы. В одной иды и заголовки, во второй соответствующие записи.
Код |
$connection = mysql_connect($dbhost, $dbuser, $dbpass); $SelectedDB = mysql_select_db($dbname); $result = mysql_query("SELECT * FROM note_table LEFT JOIN note ON note_table.not_id=note.not_id WHERE usr_not_id='2';"); $table = array(); while ($row = mysql_fetch_array($result)) { $table[$row['not_name']][] = $row; } foreach($table as $division => $people){ echo "<b>".$division."</b><br>"; for($i=0; $i<count($people); $i++){ $row = $people[$i]; echo $row['not_date']." "; echo $row['not_content']." "; echo $row['not_order']." "; echo "</br>"; }} |
Попытался присвоить идам соответствующие значения
Код |
$connection = mysql_connect($dbhost, $dbuser, $dbpass); $SelectedDB = mysql_select_db($dbname); $result = mysql_query("SELECT * FROM note WHERE usr_not_id='1';"); $table = array(); $not_names = array( "Звания" => "1" , "Награды и поощрения" => "2" , "Взыскание" => "3" , "Назначение и поощрениея" => "4" , ); while ($row = mysql_fetch_array($result)) { $table[$row['not_id']][] = $row; } foreach($table as $division => $people){ foreach($not_names as $notnames => $notid){ if($division == $notid){ echo "<b>".$notnames."</b><br>"; }} for($i=0; $i<count($people); $i++){ $row = $people[$i]; echo $row['not_date']." "; echo $row['not_content']." "; echo $row['not_order']." "; echo "</br>"; }} |
Таблица имеет следующий вид
nid | not_id | usr_not_id not_date | not_content | not_order
Помогите разобраться. Ламер я, да! Ну уж очень хочется разобраться и чему нить научиться


Спустя 12 часов, 26 минут, 41 секунда (3.07.2008 - 17:28) Alchemist написал(а):
с большим трудом, но вроде
я разобрался в коде
(блин, я тут с вами поэтом стану (с))
Вобщем, тебе надо почтитать про разницу условий ON и WHERE.
Если в кратце, то условия ON выполняются во время соединения таблиц, что собственно и позволяет нам прозволить всякие финты ушами при LEFT JOIN'ах. Условие WHERE выполняется уже после соединения таблиц, на получившейся "большой" таблице. (не считая случаев оптимизации, но про них надо говорить отдельно)
Применительно к твоему случаю происходит следующее:
При JOIN'е у тебя создается строка например {"Звания", NULL, NULL, NULL}, т.е. заговок для которого нет заметок. Заметь, что "usr_not_id" тут равен NULL, т.к. он хранится во второй таблице. Доходим до WHERE, и видим условие: usr_not_id='2', т.е. эта строка моментально отбрасывается, как неподходящая.
Решение:
Перенести условие из WHERE в ON. Т.е.:
SELECT * FROM note_table LEFT JOIN note ON (note_table.not_id=note.not_id AND note.usr_not_id='2') WHERE 1
я разобрался в коде
(блин, я тут с вами поэтом стану (с))
Вобщем, тебе надо почтитать про разницу условий ON и WHERE.
Если в кратце, то условия ON выполняются во время соединения таблиц, что собственно и позволяет нам прозволить всякие финты ушами при LEFT JOIN'ах. Условие WHERE выполняется уже после соединения таблиц, на получившейся "большой" таблице. (не считая случаев оптимизации, но про них надо говорить отдельно)
Применительно к твоему случаю происходит следующее:
При JOIN'е у тебя создается строка например {"Звания", NULL, NULL, NULL}, т.е. заговок для которого нет заметок. Заметь, что "usr_not_id" тут равен NULL, т.к. он хранится во второй таблице. Доходим до WHERE, и видим условие: usr_not_id='2', т.е. эта строка моментально отбрасывается, как неподходящая.
Решение:
Перенести условие из WHERE в ON. Т.е.:
SELECT * FROM note_table LEFT JOIN note ON (note_table.not_id=note.not_id AND note.usr_not_id='2') WHERE 1
Спустя 28 минут, 20 секунд (3.07.2008 - 17:57) Shurick написал(а):
Цитата(Alchemist @ 3.7.2008, 14:28) [snapback]42158[/snapback]
с большим трудом, но вроде
я разобрался в коде
(блин, я тут с вами поэтом стану (с))
Вобщем, тебе надо почтитать про разницу условий ON и WHERE.
Если в кратце, то условия ON выполняются во время соединения таблиц, что собственно и позволяет нам прозволить всякие финты ушами при LEFT JOIN'ах. Условие WHERE выполняется уже после соединения таблиц, на получившейся "большой" таблице. (не считая случаев оптимизации, но про них надо говорить отдельно)
Применительно к твоему случаю происходит следующее:
При JOIN'е у тебя создается строка например {"Звания", NULL, NULL, NULL}, т.е. заговок для которого нет заметок. Заметь, что "usr_not_id" тут равен NULL, т.к. он хранится во второй таблице. Доходим до WHERE, и видим условие: usr_not_id='2', т.е. эта строка моментально отбрасывается, как неподходящая.
Решение:
Перенести условие из WHERE в ON. Т.е.:
SELECT * FROM note_table LEFT JOIN note ON (note_table.not_id=note.not_id AND note.usr_not_id='2') WHERE 1
я разобрался в коде
(блин, я тут с вами поэтом стану (с))
Вобщем, тебе надо почтитать про разницу условий ON и WHERE.
Если в кратце, то условия ON выполняются во время соединения таблиц, что собственно и позволяет нам прозволить всякие финты ушами при LEFT JOIN'ах. Условие WHERE выполняется уже после соединения таблиц, на получившейся "большой" таблице. (не считая случаев оптимизации, но про них надо говорить отдельно)
Применительно к твоему случаю происходит следующее:
При JOIN'е у тебя создается строка например {"Звания", NULL, NULL, NULL}, т.е. заговок для которого нет заметок. Заметь, что "usr_not_id" тут равен NULL, т.к. он хранится во второй таблице. Доходим до WHERE, и видим условие: usr_not_id='2', т.е. эта строка моментально отбрасывается, как неподходящая.
Решение:
Перенести условие из WHERE в ON. Т.е.:
SELECT * FROM note_table LEFT JOIN note ON (note_table.not_id=note.not_id AND note.usr_not_id='2') WHERE 1
Не знаю станешь ли ты поэтом, но то что я начинаю разбираться в SQL с Вашей помощью - это точно! За что Большой респект.

Я пытаюсь вникнуть в примеры и мануалы но не всегда хватает времени и просто опыта.
Все работает. Единственное не понял что означает WHERE 1
Спустя 19 минут, 45 секунд (3.07.2008 - 18:16) Shurick написал(а):
И еще вопрос по быстродействию вывода -
Как лучше сделать: записывать все заметки в одну таблицу или разбить по типам - для каждого типа заметок создавать отдельную таблицу и связывать их в запросе?
Пользователей конечно не так уж много (где то 200 человек), ну и соответственно для каждого нужно внести около 20 заметок.
Как лучше сделать: записывать все заметки в одну таблицу или разбить по типам - для каждого типа заметок создавать отдельную таблицу и связывать их в запросе?
Пользователей конечно не так уж много (где то 200 человек), ну и соответственно для каждого нужно внести около 20 заметок.
Спустя 6 минут, 3 секунды (3.07.2008 - 18:23) redow написал(а):
Shurick, лучше всего, и так делают почти всегда, все заметки писать в одну таблицу, и в нее добавить еще 1 столбик - тип заметки. потом просто если вам нужно выбрать заметки по их типу, просто указать в условии ее тип.
Спустя 4 минуты, 49 секунд (3.07.2008 - 18:27) Shurick написал(а):
Цитата(redow @ 3.7.2008, 15:23) [snapback]42174[/snapback]
Shurick, лучше всего, и так делают почти всегда, все заметки писать в одну таблицу, и в нее добавить еще 1 столбик - тип заметки. потом просто если вам нужно выбрать заметки по их типу, просто указать в условии ее тип.
Спасибо! На данный момент я именно так и реализовал. Для типов заметок я сделал отдельную таблицу (на всякий случай, вдруг придется добавлять новый тип).
Спустя 23 минуты, 9 секунд (3.07.2008 - 18:50) Shurick написал(а):
$result = mysql_query("SELECT * FROM note_table LEFT JOIN note ON (note_table.not_id=note.not_id AND note.usr_not_id='$pilot_id') WHERE 1 ORDER BY note_table.not_id ");
Отсортировал по возрастанию разделы. Можно ли вставить еще сортировку по датам заметок или лучше отсортировать непосредственно иным способом?
Отсортировал по возрастанию разделы. Можно ли вставить еще сортировку по датам заметок или лучше отсортировать непосредственно иным способом?
Спустя 1 день, 18 часов, 58 минут, 28 секунд (5.07.2008 - 13:49) Alchemist написал(а):
Цх.... Такой хороший студент был... Вопросы по существу задавал... А тут на тебе... Два вопроса ответы на которые есть в любом мануале... Эх...
WHERE 1, WHERE 1=1 и т.д. - это условия "всегда верно". В принципе их можно не писать, но я предпочитаю добавлять WHERE 1 в запросы для визуального контроля.
Сортировку по многим полям делать можно. ORDER BY {col1} , {col2} отсортирует таблицу сначала по {col1}, а затем внутри блоков с одинаковым {col1} отсортирует строки по {col2}
WHERE 1, WHERE 1=1 и т.д. - это условия "всегда верно". В принципе их можно не писать, но я предпочитаю добавлять WHERE 1 в запросы для визуального контроля.
Сортировку по многим полям делать можно. ORDER BY {col1} , {col2} отсортирует таблицу сначала по {col1}, а затем внутри блоков с одинаковым {col1} отсортирует строки по {col2}
Спустя 1 час, 4 минуты, 9 секунд (5.07.2008 - 14:53) Shurick написал(а):
Цитата(Alchemist @ 5.7.2008, 10:49) [snapback]42289[/snapback]
Цх.... Такой хороший студент был... Вопросы по существу задавал... А тут на тебе... Два вопроса ответы на которые есть в любом мануале... Эх...
WHERE 1, WHERE 1=1 и т.д. - это условия "всегда верно". В принципе их можно не писать, но я предпочитаю добавлять WHERE 1 в запросы для визуального контроля.
Сортировку по многим полям делать можно. ORDER BY {col1} , {col2} отсортирует таблицу сначала по {col1}, а затем внутри блоков с одинаковым {col1} отсортирует строки по {col2}
WHERE 1, WHERE 1=1 и т.д. - это условия "всегда верно". В принципе их можно не писать, но я предпочитаю добавлять WHERE 1 в запросы для визуального контроля.
Сортировку по многим полям делать можно. ORDER BY {col1} , {col2} отсортирует таблицу сначала по {col1}, а затем внутри блоков с одинаковым {col1} отсортирует строки по {col2}
Ну сорри


С сортировкой тоже разобрался буквально через 5 минут...

Попробовал записать дату в ручную 5.07.2008. Но при такой записи сортировка проходит не верно. Учитываются первые числа, а месяй и год игнорируются.
Как всегда в качестве примера взял таблицу форума
Дата рождения пользователей записывается в три ячейки, а дата допустим последнего обновления одной строкой. Вчера походил по форуму и по советам записываю в формате DATE.
Вот тут у меня ступор. Кто то записывает в формате 2008-07-05, кто то 2008,07,05 а на форуме вот такая форма записи 1119842336. Я конечно же понимаю что это дата и время. Но как вывести в браузер эту строку в нужной форме. Да и вообще каким форматом лучше всего пользоваться?! Надеюсь я прально поставил вопрос...

Спустя 4 минуты, 43 секунды (5.07.2008 - 14:58) Ghost написал(а):
Alchemist, дополнительные проверки тормозят запрос.. в этом случае каждая запись будет проверена..
Спустя 11 часов, 4 минуты, 1 секунда (6.07.2008 - 02:02) Alchemist написал(а):
Цитата(Ghost @ 5.7.2008, 14:58) [snapback]42297[/snapback]
Alchemist, дополнительные проверки тормозят запрос.. в этом случае каждая запись будет проверена..
не будет.
MySQL делает различные WHERE оптимизации, одной из которых является:
Цитата(MySQL Manual)
Constant condition removal (needed because of constant folding):
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
(B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
-> B=5 OR B=6
Взято отсюда.
Спустя 42 минуты, 58 секунд (6.07.2008 - 02:45) Alchemist написал(а):
Цитата(Shurick @ 5.7.2008, 14:53) [snapback]42295[/snapback]
Щас разбираюсь с датой. Слишком много способов записи.
Попробовал записать дату в ручную 5.07.2008. Но при такой записи сортировка проходит не верно. Учитываются первые числа, а месяй и год игнорируются.
Как всегда в качестве примера взял таблицу форума
Дата рождения пользователей записывается в три ячейки, а дата допустим последнего обновления одной строкой. Вчера походил по форуму и по советам записываю в формате DATE.
Вот тут у меня ступор. Кто то записывает в формате 2008-07-05, кто то 2008,07,05 а на форуме вот такая форма записи 1119842336. Я конечно же понимаю что это дата и время. Но как вывести в браузер эту строку в нужной форме. Да и вообще каким форматом лучше всего пользоваться?! Надеюсь я прально поставил вопрос...
Попробовал записать дату в ручную 5.07.2008. Но при такой записи сортировка проходит не верно. Учитываются первые числа, а месяй и год игнорируются.
Как всегда в качестве примера взял таблицу форума
Дата рождения пользователей записывается в три ячейки, а дата допустим последнего обновления одной строкой. Вчера походил по форуму и по советам записываю в формате DATE.
Вот тут у меня ступор. Кто то записывает в формате 2008-07-05, кто то 2008,07,05 а на форуме вот такая форма записи 1119842336. Я конечно же понимаю что это дата и время. Но как вывести в браузер эту строку в нужной форме. Да и вообще каким форматом лучше всего пользоваться?! Надеюсь я прально поставил вопрос...

Да, это щекотливый вопрос, кторый каждый решает сам для себя.
Если ты хочешь просто хранить дату, не включая ее в запросы ни в каком условии, то тебе подойдет и обычный CHAR(10). Причем в этом случае ее можно хранить уже в готовом для печати виде(например DD.MM.YYYY).
Если все что ты хочешь от даты - это сортировка, то один из подходящих форматов это Unix Timestamp и хранение в INT(11) (или INT(10), как подсказывали мне на этом форуме). В этом случа сортировка будет проходить быстрее, поскольку сортироваться будут числа, а не строки.
Соответственно на печать дату можно будет вывести в любом формате через php-функцию date().
Ну и, наконец, если ты хочешь включать дату в сложные условия выбора, (ON, WHERE, HAVING), то ты по-прежнему можешь использовать один из перечисленных вариантов, но, ИМХО, гораздо удобнее будет воспользоваться одним из типов предоставляемых MySQL.
Плюсы очевидны:
1) данные хранятся в виде чисел, поэтому все операции: сложение, вычитание, сравнение, поиск - относительно быстры.
2) для этих типов MySQL предоставляет большое количество функций, позволяющих создавать условия любой сложности
3) есть замечательная MySQL-функция DATE_FORMAT(), обеспечивающая вывод даты в любой удобной форме. Кроме того, если есть какие-то причины (физические, моральные или религиозные), запрещающиее использование этой функции, то всегда можно воспользоваться комбинацией strtottime() -> date().
Лично я при работе с датами всегда пользуюсь одним из MySQL'евских форматов. Но, как я писал выше, каждый выбирает для себя...
ЗЫ: Наверное стоит добавить, что Unix Timestamp и MySQL Timestamp - это разные форматы. Unix Timestamp - это кол-во секунд прошедших с полуночи 1 января 1970 года. MySQL Timestamp - это время записаное в одном из двух форматов: YYYYMMDDHHMMSS или YYYY-MM-DD HH:MM:SS.
Спустя 6 часов, 21 минута, 58 секунд (6.07.2008 - 09:07) Ghost написал(а):
да ты прав..
наверно еще из какой-то старой книжки осталось
наверно еще из какой-то старой книжки осталось

Спустя 7 часов, 48 минут, 49 секунд (6.07.2008 - 16:56) Shurick написал(а):
Alchemist! Спасибо за целое пособие!!!
Вообщем в базу я записываю дату в формате DATE, на сколько я понял ты посоветовал именно этот формат (2008-05-06)
Для добовления записи поставил следующую форму
Вообщем в базу я записываю дату в формате DATE, на сколько я понял ты посоветовал именно этот формат (2008-05-06)
Для добовления записи поставил следующую форму
Код |
$out = '<select name="days">'; for($i = 1; $i <= 32; $i++){ $out .= '<option value="'.$i.'">'.$i.'</option>'; } $months = array('Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'); $out .= '</select><select name="month">'; foreach($months as $key => $month){ $out .= '<option value="'.$key.'">'.$month.'</option>'; } $out .= "</select><select name='year'>"; for($i = date('Y'); $i >= 2005; $i--){ $out .= '<option value="'.$i.'">'.$i.'</option>'; } $out .= "</select>"; $note_date = array( "NOTE_DATE" => $out, ); |
Вывожу
Код |
$print_date = date("d.m.Y",strtotime($row['not_date'])); |
Пожалуй воспользуюсь этой формой записи во всей базе. По моему довольно удобно. Нет проблем с выводом, можно придать без проблем любой формат. И с сортировкой нет заминок!
Еще раз спасибо!!!
Спустя 55 минут, 37 секунд (6.07.2008 - 17:51) Shurick написал(а):
В данный момент работаю на следующей загадкой базы...
Каждому пользователю нужно повесить медали. Их количество ограниченно. Допустим можно повесить всего две медали за боевые заслуги, две медали красной заезды и т.д.
Я конечно могу заметить тем же способом которым записываю личные заметки, но не хотелось бы притормаживать скорость загрузки и создавать избыточную базу.
Я так себе думаю есть несколько вариантов:
1 Создать таблицу с перечнем наград (ид, название, урл на картинку, урл на колодку). Можно в одной ячейке пользователя перечислить через запятую иды медалей.
Но:
Хочется что бы все было автоматизированно.
Как в таком случае удалять определенную медаль? И опять же я только ушел от всяких там explod-ов что бы создать СТАБИЛЬНУЮ админку без глюков и возвращаться к этому нет желания.
2 создать таблицу с идами пользователей и прописать соответствующее медалям количество ячеей. в каждой ячейке прописывать медаль, если она есть.
К примеру
id | red_star | ow_I | ow_II | ...
2 | 2 | 1 | 2 |
С чего следует вывести 2 медали КРСНОЙ ЗВЕЗДЫ, 1 орден ОВ 1-й степини, 2 ордена ОВ 2-й степени.
В этом случае на каждого пользователя будет припадать всего одна строка в таблице наград.
НО:
Как в таком случае присвоить определенной медали урл картинки через сравнение таблиц.
Ну и естественно можно на каждую медаль создавать отдельную строку с ид-ом пользователя и ид-ом медали. Но по-моему именно этот вариант самый неподходящий, но самый простой.
Может есть иной способ?
Каждому пользователю нужно повесить медали. Их количество ограниченно. Допустим можно повесить всего две медали за боевые заслуги, две медали красной заезды и т.д.
Я конечно могу заметить тем же способом которым записываю личные заметки, но не хотелось бы притормаживать скорость загрузки и создавать избыточную базу.
Я так себе думаю есть несколько вариантов:
1 Создать таблицу с перечнем наград (ид, название, урл на картинку, урл на колодку). Можно в одной ячейке пользователя перечислить через запятую иды медалей.
Но:
Хочется что бы все было автоматизированно.
Как в таком случае удалять определенную медаль? И опять же я только ушел от всяких там explod-ов что бы создать СТАБИЛЬНУЮ админку без глюков и возвращаться к этому нет желания.
2 создать таблицу с идами пользователей и прописать соответствующее медалям количество ячеей. в каждой ячейке прописывать медаль, если она есть.
К примеру
id | red_star | ow_I | ow_II | ...
2 | 2 | 1 | 2 |
С чего следует вывести 2 медали КРСНОЙ ЗВЕЗДЫ, 1 орден ОВ 1-й степини, 2 ордена ОВ 2-й степени.
В этом случае на каждого пользователя будет припадать всего одна строка в таблице наград.
НО:
Как в таком случае присвоить определенной медали урл картинки через сравнение таблиц.
Ну и естественно можно на каждую медаль создавать отдельную строку с ид-ом пользователя и ид-ом медали. Но по-моему именно этот вариант самый неподходящий, но самый простой.
Может есть иной способ?
Спустя 19 часов, 46 минут, 55 секунд (7.07.2008 - 13:38) Alchemist написал(а):
Ну а почему бы не совместить два последних варианта ? Сделай таблицу {`userID`, `medalID`, `amount`} и будет тебе щасте.
Спустя 6 часов, 13 минут, 4 секунды (7.07.2008 - 19:51) Shurick написал(а):
Цитата(Alchemist @ 7.7.2008, 10:38) [snapback]42490[/snapback]
Ну а почему бы не совместить два последних варианта ? Сделай таблицу {`userID`, `medalID`, `amount`} и будет тебе щасте.
Тоесть для каждой медали пользователя создавать отдельную строку в таблице?
Спустя 4 дня, 4 часа, 24 минуты, 18 секунд (12.07.2008 - 00:15) Shurick написал(а):
Сделал как советовал Alchemist!!!
Код |
$result = mysql_query("SELECT * FROM awards LEFT JOIN user_awards ON (awards.wid=user_awards.awaid) WHERE usrwid='$pilot_id'"); $table = array(); while ($row = mysql_fetch_array($result)) { for($i=0; $i < $row['amount']; $i++ ){ echo $row['wmed']; }} |
Верно?
Спустя 1 день, 14 часов, 12 минут, 21 секунда (13.07.2008 - 14:28) Alchemist написал(а):
ну, раз сработало как хотелось - значит верно

Спустя 12 часов, 8 минут, 35 секунд (14.07.2008 - 02:36) Shurick написал(а):
Так хорошо продвигалась работа, но опять зашел в тупик.
Есть две таблицы.
В первой записаны отделы
div_id | div_name | div_pass....
во второй перечислены иды пользователи относящиеся к определенному отделу
usr_div_id | divid | usr_id | usr_post....
Необходимо вывести список отделов и пересчитать количество пользователей входящих в определенны отдел не связывая между собой таблицы.
пример:
1-ая истребительная эскадрилья (15)
2-ая истребительная эскадрилья (10)
Когда связываю две таблицы - имена отделов дублируются столько раз, сколько пользователей входит в состав данного отделу. Есно можно намутить скрипт из примеров которые указывались выше, но хотелось бы во-первых минимизировать скрипт да и вообще разобраться - может все намного проще чем я думаю.
Есть две таблицы.
В первой записаны отделы
div_id | div_name | div_pass....
во второй перечислены иды пользователи относящиеся к определенному отделу
usr_div_id | divid | usr_id | usr_post....
Необходимо вывести список отделов и пересчитать количество пользователей входящих в определенны отдел не связывая между собой таблицы.
пример:
1-ая истребительная эскадрилья (15)
2-ая истребительная эскадрилья (10)
Когда связываю две таблицы - имена отделов дублируются столько раз, сколько пользователей входит в состав данного отделу. Есно можно намутить скрипт из примеров которые указывались выше, но хотелось бы во-первых минимизировать скрипт да и вообще разобраться - может все намного проще чем я думаю.
Спустя 13 часов, 11 минут, 48 секунд (14.07.2008 - 15:48) Alchemist написал(а):
Спустя 10 часов, 2 минуты, 43 секунды (15.07.2008 - 01:51) Shurick написал(а):
ухххх((( мне даж стыдно спрашивать, но выхода просто нет...
Просидел 4 часа и результата нет.
Как посчитать количество строк в таблице эт понятно SELECT COUNT(*) FROM users , но никак не могу понять куда тута воткнуть COUNT(*)
SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.us_id) GROUP BY division.did
И нужен ли здесь вообще LEFT JOIN, мне ведь не надо выводить на данной странице пользователей а только названия отделов?!?



Как посчитать количество строк в таблице эт понятно SELECT COUNT(*) FROM users , но никак не могу понять куда тута воткнуть COUNT(*)

SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.us_id) GROUP BY division.did
И нужен ли здесь вообще LEFT JOIN, мне ведь не надо выводить на данной странице пользователей а только названия отделов?!?
Спустя 13 часов, 50 минут, 11 секунд (15.07.2008 - 15:41) Alchemist написал(а):
Цитата(Shurick @ 15.7.2008, 1:51) [snapback]43520[/snapback]
Как посчитать количество строк в таблице эт понятно SELECT COUNT(*) FROM users , но никак не могу понять куда тута воткнуть COUNT(*)
SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.us_id) GROUP BY division.did
И нужен ли здесь вообще LEFT JOIN, мне ведь не надо выводить на данной странице пользователей а только названия отделов?!?

SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.us_id) GROUP BY division.did
И нужен ли здесь вообще LEFT JOIN, мне ведь не надо выводить на данной странице пользователей а только названия отделов?!?
Так прямо туда и втыкай:
SELECT divsion.*, COUNT(*) AS `users` FROM ...
JOIN'ить конечно же необходимо, иначе как ты найдешь кол-во юзеров имея на руках только данные об отделах ?
ЗЫ: проверь, что ты связываешь таблицы правильно, а то мне кажется ты не то поле используешь... (us_id).
Спустя 2 часа, 37 минут, 58 секунд (15.07.2008 - 18:19) Shurick написал(а):
Цитата(Alchemist @ 15.7.2008, 12:41) [snapback]43592[/snapback]
Цитата(Shurick @ 15.7.2008, 1:51) [snapback]43520[/snapback]
Как посчитать количество строк в таблице эт понятно SELECT COUNT(*) FROM users , но никак не могу понять куда тута воткнуть COUNT(*)
SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.us_id) GROUP BY division.did
И нужен ли здесь вообще LEFT JOIN, мне ведь не надо выводить на данной странице пользователей а только названия отделов?!?

SELECT * FROM division LEFT JOIN division_user ON (division.did=division_user.us_id) GROUP BY division.did
И нужен ли здесь вообще LEFT JOIN, мне ведь не надо выводить на данной странице пользователей а только названия отделов?!?
Так прямо туда и втыкай:
SELECT divsion.*, COUNT(*) AS `users` FROM ...
JOIN'ить конечно же необходимо, иначе как ты найдешь кол-во юзеров имея на руках только данные об отделах ?
ЗЫ: проверь, что ты связываешь таблицы правильно, а то мне кажется ты не то поле используешь... (us_id).
Да, ты прав - там есть ошибка... С отчаянья курочил скрипт и так и сяк, вот и отписался с ошибкой.
Ждал я твоего ответа как манны небесной

Спустя 13 минут, 46 секунд (15.07.2008 - 18:33) Shurick написал(а):
Как у тебя все легко получается. Надеюсь пройдет некоторое время и я то же смогу помагать таким ламерам как я
так и сделал
SELECT division.*, COUNT(*) AS us_id FROM division LEFT JOIN division_user ON (division.did=division_user.div_id) GROUP BY division.did
вывожу
имя отдела
$row['dname']
и количество пользователей
$row['us_id']
Alchemist! Респект тебе за терпение и понимание! Еще раз СПАСИБО...


так и сделал
SELECT division.*, COUNT(*) AS us_id FROM division LEFT JOIN division_user ON (division.did=division_user.div_id) GROUP BY division.did
вывожу
имя отдела
$row['dname']
и количество пользователей
$row['us_id']
Alchemist! Респект тебе за терпение и понимание! Еще раз СПАСИБО...
Спустя 2 минуты, 6 секунд (15.07.2008 - 18:35) Shurick написал(а):
...
Спустя 19 минут, 43 секунды (15.07.2008 - 18:55) Shurick написал(а):
Чет фигня какая то... Добавляю новый , пустой отдел а скрипт мне считает одного пользователя. Что то не верно я намутил...
Спустя 36 минут, 10 секунд (15.07.2008 - 19:31) Shurick написал(а):
изменил скрипт
SELECT division.*, COUNT(us_id) AS us_id FROM division LEFT JOIN division_user ON (division.did=division_user.div_id) GROUP BY division.did
Сейчас все верно считает. Но что то мне подсказывает что в таком случает что то тут лишнее. Или я ошибаюсь?!
Спустя 5 часов, 24 минуты, 21 секунда (16.07.2008 - 00:55) Shurick написал(а):
использую ячейку dpos в таблице отделов для сортировки но при использовании GROUP BY строки с одинаковыми значениями dpos исчезают, то есть исчезает одна из них... Как в таком случае сортировать вывод данных? Пробовал вставить вместо GROUP --- ORDER , сервер выдает ошибку.
Спустя 11 часов, 14 минут, 39 секунд (16.07.2008 - 12:10) Alchemist написал(а):
Цитата(Shurick @ 16.7.2008, 0:55) [snapback]43628[/snapback]
использую ячейку dpos в таблице отделов для сортировки но при использовании GROUP BY строки с одинаковыми значениями dpos исчезают, то есть исчезает одна из них... Как в таком случае сортировать вывод данных? Пробовал вставить вместо GROUP --- ORDER , сервер выдает ошибку.
Не совсем понял вопрос.
Если ячейка в тиблице отделов, то ни одна строка исчезать не может, т.к. из этой таблицы берутся все строки и группировка происходит по ИД строки.
Спустя 1 час, 20 минут, 40 секунд (16.07.2008 - 13:30) Shurick написал(а):
Вот он запрос
SELECT division.*, COUNT(us_id) AS us_id FROM division LEFT JOIN division_user ON (division.did=division_user.div_id) GROUP BY division.dpos
-------------------------------------------------------------------------------------------------------------------------------------------------------
Вывожу вот так
while ($row = mysql_fetch_array($result)) {
$tags = array("ID" => $row['did'], "NAME" => $row['dname'], "POS" => $row['dpos'], "COUNT" => $row['us_id']);
$template->Assign($tags);
$template->ParseIt("adminpanel_division_s");
}
-------------------------------------------------------------------------------------------------------------------------------------------------------
Таблица division
did | dname | dpass | dpos
1 | Управление Сводной Авиацио... | 13243546| 1
2 | Эскадрилья управления (Бла�... | 13243546 | 2
3 | Истребительный Авиационны�... | 13243546 | 1
-------------------------------------------------------------------------------------------------------------------------------------------------------
Вывод получается таким :
Управление Сводной Авиацио...
Эскадрилья управления (Бла...
-----------------------------------------------------------------------------------------------------------------------------------------------------
Как я понял с помощью GROUP отсортировать вывод нельзя. Если значения dpos совпадают то выводится одно из них. Вот.
Вопрос состоит в том - как в таком случае сортировать вывод данных, если конечно же в моем примере нет ошибки.
Возможно скрипт вывода у меня корявый? Хз....
SELECT division.*, COUNT(us_id) AS us_id FROM division LEFT JOIN division_user ON (division.did=division_user.div_id) GROUP BY division.dpos
-------------------------------------------------------------------------------------------------------------------------------------------------------
Вывожу вот так
while ($row = mysql_fetch_array($result)) {
$tags = array("ID" => $row['did'], "NAME" => $row['dname'], "POS" => $row['dpos'], "COUNT" => $row['us_id']);
$template->Assign($tags);
$template->ParseIt("adminpanel_division_s");
}
-------------------------------------------------------------------------------------------------------------------------------------------------------
Таблица division
did | dname | dpass | dpos
1 | Управление Сводной Авиацио... | 13243546| 1
2 | Эскадрилья управления (Бла�... | 13243546 | 2
3 | Истребительный Авиационны�... | 13243546 | 1
-------------------------------------------------------------------------------------------------------------------------------------------------------
Вывод получается таким :
Управление Сводной Авиацио...
Эскадрилья управления (Бла...
-----------------------------------------------------------------------------------------------------------------------------------------------------
Как я понял с помощью GROUP отсортировать вывод нельзя. Если значения dpos совпадают то выводится одно из них. Вот.
Вопрос состоит в том - как в таком случае сортировать вывод данных, если конечно же в моем примере нет ошибки.
Возможно скрипт вывода у меня корявый? Хз....
Спустя 54 минуты, 38 секунд (16.07.2008 - 14:25) Shurick написал(а):
не знаю на сколько это пральное решение, но сделал следующим образом
$result = mysql_query("SELECT division.*, COUNT(us_id) AS us_id FROM division LEFT JOIN division_user ON (division.did=division_user.div_id ) GROUP BY division.did asc ORDER BY division.dpos");
сортирует верно...
Спустя 23 часа, 58 минут, 10 секунд (17.07.2008 - 14:23) Alchemist написал(а):
собсно это единственно-правильное решение....
_____________