Как я могу объединить 3 таблицы с MySQL и PHP? - PullRequest
0 голосов
/ 20 июня 2010

У меня есть страница, которая тянет пользователей Post, имя пользователя, теги xbc / xlk и т. Д., Что идеально ... НО, поскольку я получаю информацию из системы досок объявлений MyBB, она совершенно другая.При ответе людям разрешается изменять «Тема темы», просто отвечая и меняя ее.

Я не хочу, чтобы ПОКАЗывал измененный заголовок темы, просто исходное название всех сообщений в этой теме.

По умолчанию он отвечает «RE: название темы».Они могут легко отредактировать это, и оно будет отображаться в ячейке «Тема», и люди не будут знать, в какой теме он был опубликован, потому что они изменили свою ветку при ответе на сообщение.

Так что я просто хочу сохранитьназвание исходного потока, когда они отвечают.

Имеет смысл ~ ??

Таблицы: mybb_users Поля: uid, имя пользователя

Таблицы: mybb_userfields Поля: ufid

Таблицы: mybb_posts Поля: pid, tid, replyto, subject, ufid, имя пользователя, uid, сообщение

Таблицы: mybb_threads Поля: tid, fid, subject, uid, имя пользователя, lastpost, lastposter, lastposteruid

Я пытался выполнить несколько запросов безуспешно:

$result = mysql_query("
    SELECT * FROM mybb_users
    LEFT JOIN (mybb_posts, mybb_userfields, mybb_threads)
    ON (
        mybb_userfields.ufid=mybb_posts.uid
        AND mybb_threads.tid=mybb_posts.tid
        AND mybb_users.uid=mybb_userfields.ufid
    )
    WHERE mybb_posts.fid=42");


$result = mysql_query("
    SELECT * FROM mybb_users
    LEFT JOIN (mybb_posts, mybb_userfields, mybb_threads)
    ON (
        mybb_userfields.ufid=mybb_posts.uid
        AND mybb_threads.tid=mybb_posts.tid
        AND mybb_users.uid=mybb_posts.uid
    )
    WHERE mybb_threads.fid=42");

$result = mysql_query("
    SELECT * FROM mybb_posts 
    LEFT JOIN (mybb_userfields, mybb_threads) 
    ON (
        mybb_userfields.ufid=mybb_posts.uid
        AND mybb_threads.tid=mybb_posts.tid
    )
    WHERE mybb_posts.fid=42");

1 Ответ

2 голосов
/ 20 июня 2010

Ваш синтаксис не подходит для выполнения нескольких LEFT JOIN с. Каждое объединение нуждается в собственном предложении ON.

SELECT
    *
FROM
    mybb_users
    LEFT JOIN mybb_userfields ON mybb_users.uid = mybb_userfields.ufid
    LEFT JOIN mybb_posts ON mybb_userfields.ufid = mybb_posts.uid
    LEFT JOIN mybb_threads ON mybb_posts.tid = mybb_threads.tid
WHERE
    mybb_posts.fid = 42

Этот запрос должен дать желаемые результаты. Но это может быть не самый эффективный запрос для получения этих результатов. Проверьте вывод EXPLAIN как часть тестирования, чтобы убедиться, что он не использует сканирование таблицы или что-то подобное.

Должны ли все эти объединения быть LEFT JOIN с? LEFT JOIN заставляет MySQL объединять таблицы в указанном порядке, а не позволять оптимизатору запросов определять лучший порядок их объединения. Вот почему вам может понадобиться быть осторожным с планом выполнения запроса. Основное различие между JOIN и LEFT JOIN в том, что касается вывода запроса, заключается в том, что LEFT JOIN результирующие наборы будут содержать хотя бы одну строку для каждой строки таблицы в левой части объединения, тогда как обычная JOIN не будет содержать строки, если в правой части объединения нет совпадений.

Редактировать: Кроме того, вы говорите, что «я не хочу, чтобы ПОКАЗЫВАЕТ измененный заголовок темы, просто оригинальное название всех сообщений в этой теме». Это говорит о том, что вам нужно только подмножество столбцов из этих таблиц, в этом случае SELECT * неуместно.

...