Как настроить запрос MySQL?

Как настроить этот запрос? У меня есть награды в таблице. Например, в таблице наград награда может иметь идентификатор 1. Лента может иметь Award_id 2 в таблице наград. Затем у меня есть другая таблица, award_user, где есть award_id и userid пользователя. Итак, если я хочу дать пользователю award_id 1, а его userid — 25, он будет в таблице award_user как award_id 1 и userid 25 (что означает, что у них есть эта награда). Я хочу выбрать все награды, которые пользователь получил на основе своего идентификатора пользователя.

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

Вот что у меня пока есть..

$query = mysql_query("ВЫБЕРИТЕ * из награды, ГДЕ награда_id = (ВЫБЕРИТЕ награду_id ИЗ наградного_пользователя, ГДЕ userid = $userid)");

Не уверен, сработает это или нет.

По сути, он должен выбрать награды из таблицы наград с идентификатором award_id, который имеет идентификатор пользователя. $userid — допустимая переменная, это их идентификатор пользователя.

Спасибо!


person llw    schedule 10.08.2013    source источник
comment
вам просто (вероятно) нужно простое соединение здесь. Покажите обе свои структуры таблиц, и кто-то может показать вам, как присоединиться на основе отношений общих столбцов таблицы.   -  person James    schedule 10.08.2013


Ответы (2)


Ваш способ выражения запроса должен работать с одной небольшой поправкой. Вам нужно изменить = на in, потому что может быть более одного осведомленного

SELECT *
from award a
WHERE a.award_id in (SELECT au.award_id FROM award_user au WHERE au.userid = $userid)

Обычно это выражается в виде соединения:

select a.*
from award a join
     award_user au
     on a.award_id = au.award_id
where au.userid = $userid;

Форма join также часто более эффективна.

person Gordon Linoff    schedule 10.08.2013
comment
Я пробую первый запрос, используя in. Вот как я его изменил. SELECT * from award, award_user WHERE award_id in (SELECT award_id FROM award_user WHERE userid = $userid) Однако, протестировав замену $userid цифрой 1 в phpMyAdmin, я получаю #1052 — Столбец 'award_id' в IN/ALL/ANY подзапрос неоднозначен - person llw; 10.08.2013
comment
В вашем предложении from есть from award, award_user. Это генерирует перекрестный продукт и вызывает проблему. Неоднозначность — это award_id in часть утверждения. - person Gordon Linoff; 10.08.2013
comment
ВЫБЕРИТЕ * из награды, ГДЕ награда_id в (ВЫБЕРИТЕ награду_ид ОТ награды_пользователя, ГДЕ userid = $userid) Это работает. Однако мне нужно выбрать столбец с именем issue_id из таблицы 'award_user', поэтому я пытался выбрать SELECT * из обеих этих таблиц. - person llw; 10.08.2013
comment
@альфредо. . . Затем используйте второй запрос и просто добавьте au.issue_id к предложению select. Вы не можете извлечь дополнительные столбцы из таблиц, на которые есть ссылки в предложении where. - person Gordon Linoff; 10.08.2013
comment
Извините, я новичок в этом. Я работал только с базовыми запросами. Я попробовал второй запрос, заменив $userid на 1, и получил ошибку. #1054 - Неизвестный столбец 'au.userid' в запросе 'where': выберите a.* из награды за присоединение Award_user aw on a.award_id = au.award_id, где au.userid = 1 - person llw; 10.08.2013
comment
@альфредо. . .Был тип (aw вместо au как псевдоним таблицы). - person Gordon Linoff; 10.08.2013
comment
Вау, спасибо! Надеюсь, это работает в моем сценарии. Запрос работает нормально. выберите a.*, issue_id из награды за присоединение Award_user aw on a.award_id = aw.award_id, где aw.userid = 1 - person llw; 10.08.2013

Вам нужно присоединиться:

SELECT awards.* FROM awards
  JOIN award_user USING (award_id)
WHERE userid = :userid

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

person Ilmari Karonen    schedule 10.08.2013