Как выбрать запись из одной таблицы в базе данных mySQL, основываясь на существовании данных за секунду? - PullRequest
2 голосов
/ 23 сентября 2011

Пожалуйста, прости мое невежество здесь. SQL, безусловно, является одним из самых больших «пробелов» в моем образовании, над которыми я работаю над исправлением, в октябре. Вот сценарий:

У меня есть две таблицы в БД, из которых мне нужно получить доступ к определенным данным. Один - users, а другой - conversation_log. Основная структура описана ниже:

Пользователи:

  • id (INT)
  • имя (TXT)

conversation_log

  • userid (INT) // то же значение, что и id у пользователей - фактически единственное поле в этой таблице, которое я хочу проверить
  • вход (TXT)
  • ответ (TXT)

(обратите внимание, что я только перечисляю структуру для полей, которые {или могут быть} релевантными для текущей задачи)

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

В настоящее время два оператора SQL выглядят следующим образом:

выберите id из users, где 1; (получает список значений идентификатора пользователя для следующего запроса)

выберите id из conversation_log, где userid = $ userId limit 1; (проверяет существующие записи)

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

Ответы [ 3 ]

4 голосов
/ 23 сентября 2011

Вы должны сделать то, что называется «Присоединиться».Это объединяет строки двух таблиц на основе общих для них значений.

Посмотрите, имеет ли это смысл для вас:

SELECT DISTINCT users.name
FROM users JOIN conversation_log ON users.id = converation_log.userid

Теперь JOIN сам по себе является "внутренним"join ", что означает, что он будет возвращать только те строки, которые имеют обе таблицы.Другими словами, если конкретный разговор_log.userid не существует, он не будет возвращать какую-либо часть строки, журнала пользователя или беседы для этого идентификатора пользователя.

Кроме того, +1 за явно сформулированныйвопрос:)

РЕДАКТИРОВАТЬ: я добавил "DISTINCT", что означает отфильтровывать все дубликаты.Если пользователь появился в нескольких строках разговорного журнала, и у вас не было DISTINCT, вы бы получили имя пользователя более одного раза.Это связано с тем, что JOIN выполняет декартово произведение или каждую возможную комбинацию строк из каждой таблицы, которая соответствует вашим критериям JOIN ON.

0 голосов
/ 23 сентября 2011

Что вам нужно прочитать, так это синтаксис JOIN.

SELECT count(*), users.name 
FROM users  left join conversion_log  on users.id = conversation_log.userid
Group by users.name

Вы можете добавить в конце, если хотите, чтобы HAVING count (*)> 0

0 голосов
/ 23 сентября 2011

Примерно так:

SELECT *
FROM users
WHERE EXISTS (
    SELECT *
    FROM conversation_log
    WHERE users.id = conversation_log.userid
)

Простым английским языком: выберите каждую строку из users, так что есть хотя бы одна строка из conversation_log с соответствующим userid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...