Проблем с INNER JOIN заявка..?

streleca_stz

Registered
Здравейте! Тъй като съм начинаещ в JOIN заявките и не съм сигурен как точно да оправя проблема реших да пиша на вас... Та ето я и самата заявка
PHP:
$q = mysql_query('SELECT users_pm.pm_id, users_pm.to, users_pm.from, users_pm.title, users_pm.open
	FROM `users_pm`
	INNER JOIN `users`
	ON users.username = users_pm.from
	WHERE users_pm.to = "'.$_SESSION['user_info']['username'].'"
	ORDER BY users_pm.open DESC') or die (mysql_error());

Ето какво по принцип очаквам от заявката.. Тя трябва да изведе всички лични съобщения както и id-то на потребителите изпратили съобщенията..

Обаче на мен ми изкарва това
Illegal mix of collations (utf8_unicode_ci,IMPLICIT) and (utf8_general_ci,IMPLICIT) for operation '='
Някакви предложения?
 
relax4o каза:
Дай си двете структури на таблиците.
`users`
CREATE TABLE IF NOT EXISTS `users` (
`user_id` int(12) NOT NULL AUTO_INCREMENT,
`rank` int(2) NOT NULL DEFAULT '0',
`active` tinyint(4) NOT NULL DEFAULT '1',
`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`date` varchar(25) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`username` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`timestamp` text CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`ip` varchar(25) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT '0.0.0.0',
`city` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`gender` tinyint(10) NOT NULL DEFAULT '1',
`hide_email` tinyint(2) NOT NULL DEFAULT '1',
`open_wall` tinyint(3) NOT NULL DEFAULT '0',
`skype` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`icq` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`site` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`avatar` varchar(1000) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 'http://tokiohotel-bg.info/img/default.png',
`signature` varchar(10000) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=552 ;
`users_pm`
CREATE TABLE IF NOT EXISTS `users_pm` (
`pm_id` int(12) NOT NULL AUTO_INCREMENT,
`from` varchar(30) NOT NULL,
`to` varchar(30) NOT NULL,
`date_send` int(11) NOT NULL,
`open` tinyint(2) NOT NULL DEFAULT '1',
`title` varchar(100) NOT NULL,
`message` text NOT NULL,
PRIMARY KEY (`pm_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
 
Мини през таблицата users_pm и на всички текстови полета задай collation = utf8_unicode_ci, ако ползваш phpMyAdmin - ще го откриеш като кликнеш на редактиране за всяко едно от тези полета

from, to, title, message

Друг е въпроса, че ако във from и to запиваш id на потребителите, тези полета трябва да са int(12) по подобие на user_id от users

Сега видях, че ти всъщност записваш username в тези колони. Какво ще стане, ако потребителя си промени username?
 
exec каза:
Мини през таблицата users_pm и на всички текстови полета задай collation = utf8_unicode_ci, ако ползваш phpMyAdmin - ще го откриеш като кликнеш на редактиране за всяко едно от тези полета

from, to, title, message

Друг е въпроса, че ако във from и to запиваш id на потребителите, тези полета трябва да са int(12) по подобие на user_id от users

Сега видях, че ти всъщност записваш username в тези колони. Какво ще стане, ако потребителя си промени username?

Мм сега заявката се изпълнява, обаче как да изкарам ID-то? В смисъл echo ...? Понеже в момента изкарвам заглавието примерно така: $row['title'], обаче не става така за ИД-то на потребителя.. И искам да попитам така заявката всичко ли селектира от базата users? Понеже на мен ми трябват само ИД-тата и нищо друго.. Пък не искам да си затормозявам сайта и да зарежда по-бавно..

Ии потребителя няма как да си смени потребителското име :) Просто не е разрешено в сайта.. :P
 
В момента, нищо от таблицата users не се връща в резултата. Трябва да включиш съответните колони там в началото:

PHP:
$q = mysql_query('SELECT users_pm.pm_id, users_pm.to, users_pm.from, users_pm.title, users_pm.open, users.user_id
        FROM `users_pm`
        INNER JOIN `users`
        ON users.username = users_pm.from
        WHERE users_pm.to = "'.$_SESSION['user_info']['username'].'"
        ORDER BY users_pm.open DESC') or die (mysql_error());

//сега вече....
echo $row['user_id'];
 
Търсенето би било по-бързо и размера на таблицата users_pm би бил по-малък, ако вместо потребителските имена, във колоните from и to запазваш user_id
 
exec каза:
Търсенето би било по-бързо и размера на таблицата users_pm би бил по-малък, ако вместо потребителските имена, във колоните from и to запазваш user_id

Хмм.. да вярно.. Аз по принцип винаги ползвам само ID-та.. Тоя път странно защо реших така да го направя.. И вярно, че не съм задал полето.. Доста тъпи грешки допускам, но просто тези са ми толкова нови и .. не мога да запомня още :D Мерси пак
 

Back
Горе