Перейти к содержимому



Что за ошибка в базе данных?

#1 Дилетант

Дилетант
  • Пользователь
  • 53 сообщений
  • Репутация: 0
0

Отправлено 26 Декабрь 2011 - 22:38

Из-за чего может быть ошибка?

SELECT u_id,u__name,u__email FROM ib_Post, ib_User LEFT JOIN ib_Subscription sb ON (sb.uid=u_id AND sb.tid=p_tid) LEFT JOIN ib_UserAccess ua ON
(ua.uid=u_id AND ua.fid=2) WHERE p_uid=u_id AND u_id>4 AND COALESCE(ua_level,u__level)>1000<br>1054: Unknown column 'p_tid' in 'on clause'

Нет столбца-поля p_tid, а в какой таблице?

Запрос непонятен для меня, чайника. Подскажите, что тут происходит? Что за SELECT FROM LEFT и т.д.

 

 

  • 0

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 27 Декабрь 2011 - 12:19

Что за SELECT FROM LEFT...

При помощи оператора JOIN можно объединить данные из двух таблиц в одну.

Из-за чего может быть ошибка?

Вы сами и ответили на свой вопрос... из-за того, что проанализировав запрос, сервер не нашел поля p_tid.
В какой таблице это поле... ну Вам виднее - Вы же работаете с этой БД... рискну предположить, что в одной из таблиц: ib_Post, ib_User... вот только из них это поле в запросе не выбирается. Также в запросе, во избежание недоразумений, желательно указывать из какой именно таблицы брать значение того или иного поля.
Вообще, код желательно постить так, чтобы его было удобно читать или разбирать тому, кто Вам решит помочь... проявляйте уважение.
  • 0


#3 yury

yury
  • Пользователь
  • 629 сообщений
  • Репутация: 176

Отправлено 28 Декабрь 2011 - 23:00

Из-за чего может быть ошибка?

SELECT u_id,u__name,u__email FROM ib_Post, ib_User LEFT JOIN ib_Subscription sb ON (sb.uid=u_id AND sb.tid=p_tid) LEFT JOIN ib_UserAccess ua ON
(ua.uid=u_id AND ua.fid=2) WHERE p_uid=u_id AND u_id>4 AND COALESCE(ua_level,u__level)>1000<br>1054: Unknown column 'p_tid' in 'on clause'

Нет столбца-поля p_tid, а в какой таблице?

Запрос непонятен для меня, чайника. Подскажите, что тут происходит? Что за SELECT FROM LEFT и т.д.

В базах не силен, но есть подозрение, что поле p_tid живет в таблице ib_Post, а запрос ищет (и не находит) его в объединении таблиц ib_User и ib_Subscription sb.
Короче, попробуйте вместо запятой написать LEFT JOIN:
SELECT u_id,u__name,u__email
FROM
ib_Post LEFT JOIN
ib_User LEFT JOIN
ib_Subscription sb ON (sb.uid=u_id AND sb.tid=p_tid) LEFT JOIN
ib_UserAccess ua ON (ua.uid=u_id AND ua.fid=2)
WHERE p_uid=u_id AND u_id>4 AND COALESCE(ua_level,u__level)>1000

Ну или действительно поискать, в какой из таблиц на самом деле живет поле p_tid.
  • 0

#4 Евгений

Евгений
  • Пользователь
  • 481 сообщений
  • Репутация: 0

Отправлено 28 Декабрь 2011 - 23:20

попробуйте так

SELECT * FROM ib_Post, ib_User LEFT JOIN ib_Subscription sb ON (sb.uid=u_id AND sb.tid=ib_post.tid) LEFT JOIN ib_UserAccess ua ON
(ua.uid=u_id AND ua.fid=2) WHERE p_uid=u_id AND u_id>4 AND COALESCE(ua_level,u__level)>1000

но скорей всего работать не будет, тогда посмотрите поле tid в таблице ib_Post
  • 0

#5 Дилетант

Дилетант
    Topic Starter
  • Пользователь
  • 53 сообщений
  • Репутация: 0

Отправлено 29 Декабрь 2011 - 16:23

Структура таблицы ib_post
Поле 	Тип 	Ноль 	По умолчанию 	Комментарии
p_id 	int(10) 	Нет 		
p_tid 	int(10) 	Нет 	0 	
p_uid 	int(11) 	Нет 	0 	
p_text 	mediumtext 	Нет 		
p__modcomment 	mediumtext 	Нет 		
p__time 	int(10) 	Нет 	0 	
p__edittime 	int(10) 	Нет 	0 	
p_signature 	tinyint(4) 	Нет 	0 	
p__smiles 	tinyint(4) 	Нет 	0 	
p__bcode 	tinyint(4) 	Нет 	0 	
p__html 	tinyint(4) 	Нет 	0 	
p_attach 	int(11) 	Нет 	0 	
p_uname 	varchar(32) 	Нет 		
p__ip 	int(10) 	Нет 	0 	
p_title 	varchar(64) 	Нет 		
p__premoderate 	tinyint(4) 	Нет 	0

Структура таблицы ib_user
Поле 	Тип 	Ноль 	По умолчанию 	Комментарии
u_id 	int(10) 	Нет 		
u_stid 	int(10) 	Нет 	0 	
u_lnid 	int(10) 	Нет 	0 	
u__level 	smallint(6) 	Нет 	0 	
u__name 	varchar(32) 	Нет 		
u__active 	tinyint(4) 	Нет 	0 	
u__password 	varchar(32) 	Нет 		
u__email 	varchar(48) 	Нет 		
u_usesignature 	tinyint(4) 	Нет 	0 	
u_showmail 	tinyint(4) 	Нет 	0 	
u_usesmiles 	tinyint(4) 	Нет 	0 	
u_signature 	varchar(255) 	Нет 		
u_gender 	tinyint(4) 	Нет 	0 	
u_sformat 	varchar(20) 	Нет 		
u_lformat 	varchar(20) 	Нет 		
u_location 	varchar(40) 	Нет 		
u_tperpage 	smallint(6) 	Нет 	0 	
u_mperpage 	smallint(6) 	Нет 	0 	
u_homepage 	varchar(128) 	Нет 		
u_showavatars 	tinyint(4) 	Нет 	0 	
u_avatartype 	tinyint(4) 	Нет 	0 	
u__avatar 	varchar(128) 	Нет 		
u__pavatar_id 	int(11) 	Нет 	0 	
u__photo_id 	int(11) 	Нет 	0 	
u_encrypted 	tinyint(4) 	Нет 	0 	
u__regdate 	int(10) 	Нет 	0 	
u__profileupdate 	int(10) 	Нет 	0 	
u__newpassword 	varchar(32) 	Нет 		
u__title 	varchar(48) 	Нет 		
u_timeregion 	smallint(6) 	Нет 	0 	
u_icq 	int(11) 	Нет 	0 	
u_interests 	varchar(255) 	Нет 		
u_hidden 	tinyint(4) 	Нет 	0 	
u__key 	varchar(12) 	Нет 		
u_detrans 	tinyint(4) 	Нет 	0 	
u_nomails 	tinyint(4) 	Нет 	0 	
u_sortposts 	tinyint(4) 	Нет 	0 	
u_multilang 	tinyint(4) 	Нет 	0 	
u_timelimit 	smallint(6) 	Нет 	0 	
u_bday 	tinyint(3) 	Нет 	0 	
u_bmonth 	tinyint(3) 	Нет 	0 	
u_bmode 	tinyint(3) 	Нет 	0 	
u_aol 	varchar(32) 	Нет 		
u_yahoo 	varchar(32) 	Нет 		
u_msn 	varchar(64) 	Нет 		
u_jabber 	varchar(64) 	Нет 		
u_diary 	varchar(128) 	Нет 		
u_extform 	tinyint(4) 	Нет 	1 	
u_aperpage 	smallint(5) 	Нет 	0 	
u__rating 	int(10) 	Нет 	0 	
u__warnings 	int(10) 	Нет 	0 	
u__pmcount 	int(10) 	Нет 	0 	
u__warntime 	int(10) 	Нет 	0 	
u__lastlogin 	int(10) 	Нет 	0 	
u_pmnotify 	tinyint(3) 	Нет 	1 	
u__pmtime 	int(10) 	Нет 	0 	
u_realname 	varchar(60) 	Нет 		
u_nosigns 	tinyint(3) 	Нет 	0 	
u_prevmsgs 	tinyint(3) 	Нет 	5

ib_Subscription
Поле 	Тип 	Ноль 	По умолчанию 	Комментарии
uid 	int(10) 	Нет 	0 	
tid 	int(10) 	Нет 	0 	
fid 	int(11) 	Нет 	0

ib_UserAccess
Поле 	Тип 	Ноль 	По умолчанию 	Комментарии
uid 	int(10) 	Нет 	0 	
fid 	int(10) 	Нет 	0 	
ua_level 	smallint(6) 	Да 	NULL

Код, где ошибка
$sql = "SELECT p.*,t_title,t_id,f_title,f_id FROM ".$GLOBALS['DBprefix']."Post p, ".$GLOBALS['DBprefix']."Topic, ".$GLOBALS['DBprefix']."Forum ".
		  "WHERE ($pmdata) AND p_tid=t_id AND t_fid=f_id";
	$res =&db_query($sql,$link);
	$buffer=load_mail("std_post.txt");
	while ($pdata=&db_fetch_array($res)) {
	  $sql = "SELECT u_id,u__name,u__email FROM ".$GLOBALS['DBprefix']."Post, ".$GLOBALS['DBprefix']."User ".
	  "LEFT JOIN ".$GLOBALS['DBprefix']."Subscription sb ON (sb.uid=u_id AND sb.tid=p_tid) ".
	  "LEFT JOIN ".$GLOBALS['DBprefix']."UserAccess ua ON (ua.uid=u_id AND ua.fid=".$GLOBALS['forum'].") ".
	  "WHERE p_uid=u_id AND u_id>4 AND ".
	  "COALESCE(ua_level,u__level)>".$GLOBALS['inforum']['f_lmoderate'];
	  $res =&db_query($sql,$link);
	  while ($email=db_fetch_row($res)) {
		$GLOBALS['username']=$email[0];
		$GLOBALS['postername']=$GLOBALS['inuser']['u__name'];
		$GLOBALS['flink']=$GLOBALS['opt_url']."/index.php?t=".$GLOBALS['topic'];
		$GLOBALS['unsublink']=$GLOBALS['opt_url']."/agent.php?a=unsub&u=".$GLOBALS['inuserid'].
		 "&f=".$GLOBALS['forum']."&t=".$GLOBALS['topic']."&key=".md5($GLOBALS['topic'].$GLOBALS['inuser']['u__key']);
		replace_mail($buffer,$email[1],MSG_p_newmessage." ".$GLOBALS['ttitle']);
	  }

  • 0

#6 Евгений

Евгений
  • Пользователь
  • 481 сообщений
  • Репутация: 0

Отправлено 29 Декабрь 2011 - 17:00

SELECT * FROM ib_Post, ib_User LEFT JOIN ib_Subscription sb ON (sb.uid=u_id AND sb.tid=ib_post.p_tid) LEFT JOIN ib_UserAccess ua ON 
(ua.uid=u_id AND ua.fid=2) WHERE p_uid=u_id AND u_id>4 AND COALESCE(ua_level,u__level)>1000

отпишитесь, что выводит теперь
  • 0

#7 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 29 Декабрь 2011 - 17:36

В запросе надо бы поправить регистр имени таблицы, потому как не всегда может быть ib_Post == ib_post.
Если сервер установлен не под Windows, а под Unix, тогда имена таблиц могут быть чувствительны к регистру. Да и в случае если сервер БД стоит на ОС Windows также не следует злоупотреблять регистронезависимостью.
  • 0


#8 99th

99th
  • Пользователь
  • 9 сообщений
  • Репутация: 0

Отправлено 19 Январь 2012 - 16:13

В запросе надо бы поправить регистр имени таблицы, потому как не всегда может быть ib_Post == ib_post.
Если сервер установлен не под Windows, а под Unix, тогда имена таблиц могут быть чувствительны к регистру. Да и в случае если сервер БД стоит на ОС Windows также не следует злоупотреблять регистронезависимостью.


Более того, в рамках одного запроса не стоит писать имя одной и той же таблицы в разных вариантах, как рекомендовали в запросах выше (ib_Post и ib_post):

SELECT * FROM ib_Post, ib_User LEFT JOIN ib_Subscription sb ON (sb.uid=u_id AND sb.tid=ib_post.p_tid)

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru