Как правильно сформулировать запрос MySQL на 3 таблицы - PullRequest
0 голосов
/ 01 августа 2009

Мне нужен лучший способ выполнить следующую задачу. Если это возможно, сделайте все возможное, чтобы дать мне переменные для вывода, чтобы я мог лучше видеть, что происходит, часто вы, ребята, предполагаете, что я умнее меня.

Таблица 1 содержит информацию о пользователе, имя и фамилию, адрес электронной почты и т. Д. Первичным ключом auto_increment в таблице 1 является id. Таблица 2 содержит серию имен и фамилий, ее ключ - xid, а идентификатор таблицы 1 (используется для отображения только списка владельцев) - uid. Таблица 3 содержит данные конфигурации для списка пользователей в таблице 2. Так как вы можете иметь несколько конфигураций для каждого списка на пользователя, было бы неразумно включать их в таблицу 2. Таким образом, в таблице 3 есть cxid (ключ таблицы xid, обозначающий перечислите его для), а затем uid, отмечая, какой пользователь таблицы 1 может получить доступ к этой конфигурации. Его ключ auto_increment называется cid.

Так что разбить его

Table 1(user) - Primary key = id
Table 2(list) - Primary key = xid, and user field is uid.
Table 3(config) - Primary key = cid, list field is cxid, and user field is uid.

Что мне нужно сделать, так это сформулировать запрос mysql в таблице 3, чтобы для каждой строки он извлекал cxid и uid, а затем запрашивал таблицу 2 для конкретного списка. Как только он находит список, ему нужно извлечь все данные из этой строки в таблице 2, чтобы он мог выполнять функцию с этими данными.

Я не совсем уверен, с чего начать писать этот самый эффективный способ, я уверен, что есть какой-то простой способ сделать это. В настоящее время вышеупомянутые значения просто передаются в URL, но я собираюсь изменить это на сеансы, но просто предположим, что перед началом запроса я определил каждую переменную как

$variable = $_GET['variable'];

Итак, переменные: $ id, $ uid, $ cxid, $ xid

Ответы [ 2 ]

1 голос
/ 01 августа 2009

Это должно делать то, что вы хотите ...

SELECT *
FROM user AS [u]
JOIN list AS [l]
    ON l.uid = u.id
JOIN config AS [c]
    ON c.uid = u.id
    AND c.cxid = l.xid
WHERE u.id = $id
AND l.xid = $xid
AND c.cxid = $cxid

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

CREATE TABLE user
(
id INT NOT NULL
,CONSTRAINT pk_userId PRIMARY KEY (id)
)


CREATE TABLE list
(
id INT NOT NULL
,userId INT NOT NULL
,CONSTRAINT pk_listId PRIMARY KEY (id)
,CONSTRAINT fk_userList FOREIGN KEY (userId) REFERENCES user(id)
)


CREATE TABLE config
(
id INT NOT NULL
,userId INT NOT NULL
,listId INT NOT NULL
,CONSTRAINT pk_configId PRIMARY KEY (id)
,CONSTRAINT fk_userConfig FOREIGN KEY (userId) REFERENCES user(id)
,CONSTRAINT fk_listConfig FOREIGN KEY (listId) REFERENCES list(id)
)
0 голосов
/ 01 августа 2009

Из того, как вы это описали, складывается впечатление, что отношения между таблицами:

  • у одного пользователя много списков
  • в одном списке много конфигов

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

если я использую ваши термины, схема будет выглядеть примерно так:

  • Пользователь (ID)
  • Список (xid, uid)
  • Config (cid, cxid, uid)

где id = uid и xid = cxid.

И информация, которую вы хотите получить, для каждой записи в Config, все ее данные, а также все данные списка, соответствующие этой записи (вам также нужны данные пользователя?)

Это выглядит как прямое отношение, поэтому вы можете получить все эти данные одним SQL:

select c.*, l.*, u.*
from Config c
join List l
on c.cxid = l.xid
join User u
on u.id = l.uid

Этот запрос даст вам каждую запись в таблице конфигурации, содержащую все данные для списка, которому принадлежит эта конфигурация, а также все данные для пользователя, которому принадлежит этот список.

Если вы хотите получить данные для одной конкретной записи конфигурации, вы можете добавить sql для чтения как таковой (обратите внимание, что вам нужно только значение $ cid, поскольку это самый глубокий первичный ключ в этом отношении):

select c.*, l.*, u.*
from Config c
join List l
on c.cxid = l.xid
join User u
on u.id = l.uid
where c.cid = $cid

Итак, с точки зрения PHP, вы можете подойти к нему так:

// here is the sql query
$query = "select c.*, l.*, u.* from Config c join List l on c.cxid = l.xid join User u on u.id = l.uid";

// here are the results from MySQL
$result = mysql_query($query);

// and now for each result, throw it into an array called $row
while($row = mysql_fetch_assoc($result))
{
  // get some data from that row, for example, Config.`data`, List.`functionname`, and User.`FirstName`
  $config_data = $row['data'];
  $function_name = $row['functionname'];
  $first_name = $row['FirstName'];

  // now do whatever you'd like with this data, before looping to the next record...
  some_function($config_data, $function_name, $first_name);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...