Выборка из базы повторяющихся значений

ShadowSnake

Новичок
Выборка из базы повторяющихся значений

Необходимо проанализировать таблицу на пересечение преподавателей в одно и то же время.

Т.е. один преподаватель не может в одно и то же место вести занятия в разных группах.

После выполнения нижеследующего кода имеем кучу повторений. Как бы это так сделать что бы он показывал именно пересечения?

Спасибо за внимание...

PHP:
$query="SELECT
	date_main.*,
	rasp_main.*
	FROM date_main INNER JOIN rasp_main ON date_main.id=rasp_main.date_id";
	
	$result=mysql_query($query." ORDER BY date_main.date") or error(mysql_error());
	
	while ($row=mysql_fetch_array($result))
	{
		$query1=$query." WHERE date_main.date=$row[date] and rasp_main.fio='$row[fio]' and rasp_main.para=$row[para]";
		if ($row[date]!="" && $row[fio]!="" && $row[para]!="") $result2=mysql_query($query1) or error(mysql_error());
		if (@mysql_num_rows($result2)>1)
		{
			while ($row2=mysql_fetch_array($result2))
			{
				echo $row[id]." ".date("d-m-Y",$row2[date])." - ".$row2[group_number]." - $row2[fio] - $row2[para]<BR>";
			}
		} 
	}
Структура таблиц
PHP:
#
# Table structure for table 'date_main'
#

CREATE TABLE `date_main` (
  `id` int(20) unsigned NOT NULL auto_increment,
  `date` int(30) unsigned default NULL,
  `group_number` int(4) unsigned default NULL,
  PRIMARY KEY  (`id`),
  KEY `id` (`id`)
) TYPE=MyISAM;



#
# Table structure for table 'discip'
#

CREATE TABLE `discip` (
  `id` int(20) unsigned NOT NULL auto_increment,
  `discip` varchar(255) default NULL,
  `dis` varchar(255) default NULL,
  `kafedra` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) TYPE=MyISAM;



#
# Table structure for table 'para'
#

CREATE TABLE `para` (
  `id` int(20) unsigned NOT NULL auto_increment,
  `para` tinyint(20) unsigned default NULL,
  `uch_chas` varchar(255) default NULL,
  `time_begin` varchar(255) default NULL,
  `time_end` varchar(255) default NULL,
  `ter` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) TYPE=MyISAM;



#
# Table structure for table 'rasp_main'
#

CREATE TABLE `rasp_main` (
  `id` tinyint(3) unsigned NOT NULL auto_increment,
  `date_id` int(50) unsigned default NULL,
  `para` int(10) unsigned default NULL,
  `ter` varchar(255) default NULL,
  `discip` varchar(255) default NULL,
  `tip` varchar(255) default NULL,
  `tema` varchar(255) default NULL,
  `fio` varchar(255) default NULL,
  `auditor` varchar(255) default NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`)
) TYPE=MyISAM;
 

Demiurg

Guest
ты структуру таблиц распиши, в твоем коде копаться никому не захочется.
 

Demiurg

Guest
надо было не в тихоря поправлять свой пост, а честно написать структуру таблицы, тогда было бы заметно, что ты что то еще написал.

структуру надо было не из дампа брать а своими словами описывать. Я, например не понимаю, что за моле такое ter.
 

ShadowSnake

Новичок
# Table structure for table 'date_main'

TABLE `date_main`

`date` - дата проведения занятий
`group_number` - номер группы

# Table structure for table 'discip'

TABLE `discip`
`discip` - название дисциплины
`dis` - сокращенное название
`kafedra` - кафедра

# Table structure for table 'para'

TABLE `para`
`para` - номер пары
`uch_chas` - учебные часы
`time_begin` - время начала
`time_end` - время окончания
`ter` - територия проведения (у нас их несколько и на разных по разному начинаются пары)

# TABLE `rasp_main`
`date_id` - date_main.id
`para` - id пары
`ter` - id територии
`discip` - id дисциплины
`tip` - тип занятия
`tema` - тема занятия
`fio` - Ф.И.О. преподавателя
`auditor` аудитория

-~{}~ 31.03.04 08:49:

дааа.. кажется действительно никто ничего сказать не может... сколько народу посмотрело, а кроме Demiurgа никто ничего не запостил... абыдно...
 

fixxxer

К.О.
Партнер клуба
1) добавляем таблицу prepods вида (prep_id,prep_fio) с преподавателями; в rasp_main вместо fio вставляем соответствующий prep_id и вешаем на него индекс - так будет быстрее работать.
2) time_begin и time_end храним в таймстэмпах, а не в строковом виде
3) если я правильно понял, что тут к чему, то примерно так:
[sql]
select IF(para.id<para1.id,para.id,para1.id) as A, *
from rasp_main, para
join para as para1 on para.id<>para1.id
join rasp_main as rasp_main1 on rasp_main.fio=rasp_main1.fio
where /* условие для пересечения пар para и para1 */
and rasp_main.para = para.para
group by A
[/sql]
 

ShadowSnake

Новичок
Не совсем понял твой, fixxer, запрос... В особенности что же надо поставить вместо /* условие для пересечения пар para и para1 */ - пока поставил WHERE id>0

Но на него мускуль ругается и орет благим матом: "You have an error in your SQL syntax near '* FROM rasp_main, para JOIN para AS para1 ON para.id <> para1.id JOIN ras' at line 4"

MySQL 3.23.58
 

fixxxer

К.О.
Партнер клуба
А хрен знает что там в 3.23 было.
Там вроде просто join писать нельзя, надо inner join.
Условие - это когда пары пересекаются по времени.
То есть такое условие для para.time_begin, para.time_end, para1.time_begin и para1.time_end, при котором пары пересекаются.
Если я тебе и его напишу, то ты не думая и не разбираясь скопируешь код запроса. знаю я вас. :) думай.
 

ShadowSnake

Новичок
2fixxxer

:) Кажется понял... Буду думать...

-~{}~ 07.04.04 11:05:

PHP:
SELECT *, IF (para.id < para1.id, para.id, para1.id) AS A
	FROM rasp_main, para, date_main
	INNER JOIN date_main AS date1 ON date_main.id=rasp_main.date_id
	INNER JOIN para AS para1 ON para.id <> para1.id
	LEFT JOIN rasp_main AS rasp_main1 ON rasp_main.fio = rasp_main1.fio
	WHERE rasp_main.para = para.para
	GROUP BY A
Выводит только первый день забитый...

И еще, можно немного поподробнее объяснить текст этого запроса.
 
Сверху