InnoDB возвращает странные результаты? - PullRequest
0 голосов
/ 24 апреля 2011

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

По какой-то причине я получаю неправильные результаты при тестировании запроса в phpMyAdmin.

У меня есть таблица users , где uid является основным / уникальным (автоинкремент) и таблица user_profiles , которая имеет uid который является первичным / уникальным и является внешним ключом для идентификатора пользователя uid в таблице users, в основном ссылающегося на столбцы uid в обеих таблицах.

Чтобы было легче понять, вот две таблицы:

CREATE TABLE `users` (
`uid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`status` char(10) NOT NULL DEFAULT 'verify',
`username` varchar(15) NOT NULL,
`email` varchar(50) NOT NULL,
`password` char(32) NOT NULL,
`reg_date` int(11) NOT NULL,
`ip` varchar(39) DEFAULT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`),
UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

CREATE TABLE `user_profiles` (
`uid` int(10) unsigned NOT NULL,
`first_name` varchar(40) DEFAULT NULL,
`last_name` varchar(50) DEFAULT NULL,
`gender` char(6) DEFAULT NULL,
`website` varchar(100) DEFAULT NULL,
`msn` varchar(60) DEFAULT NULL,
`aim` varchar(60) DEFAULT NULL,
`yim` varchar(60) DEFAULT NULL,
`twitter` varchar(15) DEFAULT NULL,
PRIMARY KEY (`uid`),
CONSTRAINT `user_profiles_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `users` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

В основном я добавил несколько фиктивных записей в таблицу users, а затем получил users.uid и добавил uid в user_profiles, чтобы связать фиктивные записи между обеими таблицами.

Теперь проблема, которую я получил, странная, сначала вот мой запрос, который я использую в phpMyAdmin:

SELECT * FROM users INNER JOIN user_profiles
ON users.uid = '11'

По сути, этот запрос должен превратить меня только в одну из фиктивных записей из таблицы users и user_profiles, связав их вместе с помощью uid. Но как ни странно, это не так. Он возвращает все записи, даже если другие uid различны, потому что они уникальны, даже в результате запроса, он показывает, что uid уникальны и не совпадают, нет дубликатов, которых нет, и база данных все равно не допустит этого.

Теперь я не понимаю, почему, но он должен возвращать только 1 запись, так как uid уникальны, и есть только одна запись в user и user_profiles, которые имеют uid 11 (который связывает их вместе с этими uid). Как ни странно, вчера все работало нормально. Поэтому я решил удалить тестовую таблицу и начать заново, но то же самое.

У кого-нибудь есть идеи, что происходит?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2011

Вы хотите присоединиться к uid users и user_profiles, но это не то, что вы сделали, вы присоединились user_profiles on users.uid = '11'.
Это, конечно, не влияет на user_profiles, потому что вы не установили отношения между пользователями и user_profiles.

Изменение:

SELECT * FROM users INNER JOIN user_profiles
ON users.uid = '11'

Кому:

SELECT * FROM users 
INNER JOIN user_profiles ON (users.uid = user_profiles.uid)
WHERE users.uid = '11'

Теперь вы указали связь между пользователями и их профилями (совпадение идентификатора пользователя) и далее вы заявляете, что хотите, чтобы пользователи только с идентификатором uid 11.

2 голосов
/ 24 апреля 2011

Вы не связываете таблицы в ON.

Вы ничего не упомянули из user_profiles, поэтому все они требуются.

Вы должны поместить в условие ON условие соединения и в котором значение равно.

Запрос должен гласить:

SELECT * 
FROM   users 
       INNER JOIN user_profiles 
         ON users.uid = user_profiles.uid 
WHERE  users.uid = '11' 
1 голос
/ 24 апреля 2011

В предложении ON необходимо указать поля объединения обеих таблиц, а не условие фильтра, например SELECT * FROM users INNER JOIN user_profiles ON users.uid = user_profiles.uid. После этого вы можете добавить предложение WHERE как обычно, например WHERE users.uid = '11'

...