Связка таблиц в MySQL

n3o

Guest
Связка таблиц в MySQL

Вопрос такой. В MySQL таблицы, точнее ячейки можно привязывать к другим таблицам, напрмер:
Есть таблица users:
id - 1
name - Vasya
email - [email protected]

и есть таблица news:
id -
title - Hirasima&Nagosaki
author - 1

В этом случает в таблице news в поле author он подставит значение из таблицы users где id=1
А реально осуществить поиск без написания скрипта. Например:
есть таблица users[/]:
id - 1
name - Vasya
email - [email protected]

и таблица champs[/]:
id - 1
title - Turnir
1st - Kiril
2nd - Vasya
3td - Petya

и нужно чтобы MySQL выбирала из теблицы champs где встречается имя Vasya и место которое он занял.
Или это уже надо выбирать скриптом?
 

Кром

Новичок
Неправильный подход. В таблице champs следует указывать id пользователей из таблицы users и связывать по id
where champs.1st = users.id or champs.2nd = users.id or champs.3td = users.id
 

гоша

Guest
В MySQL (не вдаваясь в детали) ты должен явно указать, что users.id -- это то же самое, что news.author

Делается это в запросе, оператором "равно" ( = )
 

n3o

Guest
Немного поподробней. (если конечно это правильно)

Создается 2-е таблицы:

CREATE TABLE users (
Id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, - идентефикатор записи в таблице
name VARCHAR(255) NOT NULL, - имя пользователя
PRIMARY KEY (Id)

CREATE TABLE news (
Id MEDIUMINT NOT NULL AUTO_INCREMENT, - идентефикатор записи в таблице
title VARCHAR(255) NOT NULL, - название новости
author SMALLINT UNSIGNED NOT NULL, - автор новости
PRIMARY KEY (Id),
FULLTEXT INDEX (author),
CONSTRAINT FK_news_REFERENCE_authors FOREIGN KEY (name)
REFERENCES users (Id)

Это значит, что в таблице news в поле author будет подставлять имя из таблицы users где id будет равнятся значению из ячейки news -> author.

А вопрос в следующем.
Создаем 2-е таблицы:

CREATE TABLE champs (
Id MEDIUMINT NOT NULL AUTO_INCREMENT, - идентефикатор записи в таблице
title VARCHAR(255) NOT NULL, - название турнира
date SMALLINT UNSIGNED NOT NULL, - дата проведения
1st VARCHAR(255) NOT NULL, - кто занял первое место
2nd VARCHAR(255) NOT NULL, - кто занял второе место
3thd VARCHAR(255) NOT NULL, - кто занял тертье место
PRIMARY KEY (Id),


CREATE TABLE users (
Id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
champs SMALLINT UNSIGNED NOT NULL,
PRIMARY KEY (Id)
FULLTEXT INDEX (champs),
...

и нужно, что бы когда вызывалась информация о пользователе, то автоматически выбирались турниры, кто этот пользователь занял какое-нибудь место (1-ое,2-ое или 3-е). Значит необходимо проверять три строки в таблице champs на соответствие имени пользователя с записями в ячейках 1st, 2nd, 3thd. Можноли это осуществить не при помощи PHP кода?
 

Demiurg

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

гоша

Guest
нормальнее вообще-то будет так

champs: id,title
users: id,name
champ_users: id_user,id_champ, place
 

Demiurg

Guest
гоша
это спорно ...
если умеются строго 3 места, то лучше внести все же их в одну таблицу.
 

гоша

Guest
ну мы же грамотные проектировщики ;)
мы создаем структуру, устойчивую к будущим изменениям.

М:М -- значит, третья таблица. лучше от этого правила не отступать.
 

Demiurg

Guest
существуют еще связи M:3
Но я тебя понял, и спор бесполезен, не знаю всех деталей проекта.
 

n3o

Guest
Детали проекта просты... Рейтиг киберспортсменов России и ближнего зарубежья... а так же анкеты киберспортсменов.. %)
 
Сверху