Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из базы данных mysql 
V
    Опции темы
rnv
Дата 19.4.2008, 23:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Здравствуйте! У меня такой вопрос:
В базе данных данные хранятся так:
 fio                 exam                   ocenka           data
Иванов          Математика                            01.01.08
Иванов          Информатика                         01.01.08
Иванов          Физика                   +               01.01.08
Иванов          Астрономия                             01.01.08
Сидоров       Математика                            01.01.08
Сидоров       Информатика                         01.01.08

Если у человека, к примеру, Иванов, есть дата, но нет оценки(это "+"), значит он не сдал экзамен. Если есть оценка и есть дата - сдал.
Сам вопрос. Как из этой базы выбрать и вывести данные так, чтобы выводилась фамилия и  его не сданные экзамены, причем фамилия не должна повторяться.
К примеру: Иванов
                        Математика
                        Информатика
                        Астрономия
                   Сидоров
                        Математика
                        Информатика  
Заранее спасибо за помощь!
PM MAIL   Вверх
skyboy
Дата 20.4.2008, 00:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Код

(SELECT DISTINCT `table1`.`fio`, `table1`.`fio`
FROM `table` AS `table1`
WHERE `table1`.`ocenka` = "+")
UNION ALL 
(SELECT `table2`.`fio`, `table2`.`exam`
FROM `table` AS `table2`
WHERE `table2`.`ocenka` = "+")
ORDER BY 1

нужное тебе должно быть во втором поле результирующего запроса/
первое поле - только для сортировки.
з.ы. месье знает толк в извращениях.
такой подход дико нерационален в отношени нагрузки на сервер, страшно коряв своим видом и ужасно уродлив своей негибкостью.
пока ты не спросил, как тебе отличить фамилию от названия экзамена, идущие в одном поле результата, предложу "оптимизированный" вариант вышенаписанного уродца.
Код

(SELECT DISTINCT `table1`.`fio`, `table1`.`fio`, "фамилия"
FROM `table` AS `table1`
WHERE `table1`.`ocenka` = "+")
UNION ALL 
(SELECT `table2`.`fio`, `table2`.`exam`, "экзамен"
FROM `table` AS `table2`
WHERE `table2`.`ocenka` = "+")
ORDER BY 1, 3

PM MAIL   Вверх
Fortop
Дата 20.4.2008, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 20
Всего: 42



1.
skyboy, возможно ты напутал smile
"+" - это когда есть оценка smile т.е. 
Код

WHERE `table1`.`ocenka` <> "+"

Но надо уточнить у автора вопроса smile

2. Возможно ему надо вывести на экран так данные smile
А не получить в таком виде из базы smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
skyboy
Дата 20.4.2008, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Fortop @  20.4.2008,  00:23 Найти цитируемый пост)
skyboy, возможно ты напутал

да, напутал.
Цитата(Fortop @  20.4.2008,  00:23 Найти цитируемый пост)
А не получить в таком виде из базы

конечно. почти что наверняка(разве что это какое-то дурное учебное задание по SQL). 
слегка разминал мозгу просто
надеюсь, автора смогут отговорить от такого подхода, а то в последнее время что-то несговорчивые попадаются.
PM MAIL   Вверх
cia
Дата 20.4.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 15.1.2007

Репутация: 4
Всего: 4



Да... хреновая база...
Как я понимаю это задачка для учебного заведения. Тогда тебе, скорее всего, скажут что базу надо бы нормализовать. Поэтому попробуй сделать так:
1. создай отдельную таблицу - список учеников и добавь поле ид (счетчик)
2. создай еще одну таблицу - список экзаменов и поле ид(счетчик)
3. создай еще одну таблицу со следующими полями:
 ид ученика, ид экзамена, дата и (если нужно, оценка). и заноси в эту таблицу информацию о каждом зданном экзамене.
В итоге если экзамен сдал - есть запись в таблице №3, если не здал - записи нет.
PM WWW ICQ   Вверх
rnv
Дата 20.4.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Цитата

 fio                 exam                   ocenka           data
Иванов          Математика                            01.01.08
Иванов          Информатика                         01.01.08
Иванов          Физика                   +               01.01.08
Иванов          Астрономия                             01.01.08
Сидоров       Математика                            01.01.08
Сидоров       Информатика                         01.01.08

Дело в том, что данные хранятся в таком виде в одной таблице базы данных resullt_exm.
Я пробовал делать такой запрос  с выводом:
Код

$result =  mysql_query("SELECT DISTINCT * FROM result_exm WHERE ocenka='' AND data");
    do
    {
    
            
            echo $myrow["fio"]."&nbsp;&nbsp;".$myrow["exm_name"]."<br><br>"; 
    
    }
    while($myrow=mysql_fetch_array($result))


Но он выводит, несколько раз человека одного и того же человека. А необходимо сделать чтобы вывелся человек и его не сданные экзамены.

Это сообщение отредактировал(а) rnv - 20.4.2008, 18:23
PM MAIL   Вверх
NNaarreekk
Дата 20.4.2008, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Код

$result =  mysql_query("SELECT DISTINCT * FROM result_exm WHERE ocenka='' AND data ORDER BY `fio`");
$xxx='';    
do
    {
    
            if($myrow["fio"]!=$xxx){$xxx=$myrow["fio"]; echo$myrow["fio"];}
            echo "&nbsp;&nbsp;".$myrow["exm_name"]."<br><br>"; 
    
    }
    while($myrow=mysql_fetch_array($result))




Добавлено через 31 секунду
Написал на лету так-что за ошибки не ручаюсь smile 
PM MAIL WWW   Вверх
rnv
Дата 20.4.2008, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.4.2008

Репутация: нет
Всего: нет



Цитата(NNaarreekk @ 20.4.2008,  18:38)
Написал на лету так-что за ошибки не ручаюсь smile

Спасибо за помощь, все работает.
PM MAIL   Вверх
NNaarreekk
Дата 20.4.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 768
Регистрация: 23.6.2007
Где: Армения

Репутация: 0
Всего: 3



Да на здоровье!

Раз получил ответ закрой тему! smile 
PM MAIL WWW   Вверх
skyboy
Дата 20.4.2008, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(NNaarreekk @  20.4.2008,  19:16 Найти цитируемый пост)
закрой тему!

как же он её закроет? smile
пометить тему решенной можно справа вверху над первым постом темы(ссылка "пометить тему решенной")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3565 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.