Есть таблица users и таблица comments. Во вторю записывается id пользователя, который оставил комментарий. Хочу по этому id получить логин пользователя из таблицы users и вывести в фронте, но не понимаю как правильно составить запрос в БД. Я так понимаю нужна связь один ко многим. Кажется у меня получилось связать таблицы, но я не уверен =) Посмотрите: Код (Text): -- -- Ограничения внешнего ключа таблицы `comments` -- ALTER TABLE `comments` ADD CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`); COMMIT; Структура таблицы users: PHP: CREATE TABLE `users` ( `id` int(11) NOT NULL, `login` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `token` varchar(255) NOT NULL, `status` int(11) NOT NULL, `role` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; Структура таблицы comments: PHP: CREATE TABLE `comments` ( `id` int(11) NOT NULL, `user_id` int(11) NOT NULL, `article_id` int(11) NOT NULL, `reply_id` int(11) NOT NULL, `message` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PHP: $query = $db->prepare('SELECT `users`.`id`, `users`.`login` AS `ulogin`, `comments`.`id`, `comments`.`user_id` FROM `users` RIGHT JOIN `comments` ON (`users`.`id` = `comments`.`user_id`) WHERE `users`.`id` = ?'); $query = $db->execute([(int) $session_userID]); $result = $query->fetch(); echo $result['ulogin']; var_dump($result); $session_userID - это id пользователя хранящее в сессии $db - это подключения к базе В ON() - проверяешь чтобы id из табл. users было равно user_id из табл. comments. А вообще тебе нужен только запрос, возьми скопируй запрос: PHP: SELECT `users`.`id`, `users`.`login` AS `ulogin` `comments`.`id`, `comments`.`user_id` FROM `users` RIGHT JOIN `comments` ON (`users`.`id` = `comments`.`user_id`) WHERE `users`.`id` = ? и вставь его в базу проверь придет ли логин пользователя. Вместо знака ? поставь id пользователя который писал коммент.
@_ne_scaju_, а почему ты users джоинишь с comments, а не наоборот? Ведь ТС хочет список комментариев получить, а к ним подставить имена пользователей.
а что разве не сработает так? я думал без разницы главное сравнить id не важно с какой стороны и все --- Добавлено --- мне шпаргалка не понравилась, полная туфта.
@_ne_scaju_, там на картинке всё яснопонятно, что к кому присоединяется и что будет включено в результат.
SQL как-то по барабану нравится она тебе или нет --- Добавлено --- нарисуй качественную, хотя с "я думал без разницы главное сравнить id не важно с какой стороны и все" у тебя всё шансы Малевича с его квадратом переплюнуть.
@Valick, действительно, для переносимости же принято использовать LEFT JOIN. @_ne_scaju_, лучше помалкивай, у тебя вообще кросс
@Valick, а, понятно. --- Добавлено --- Технично исправился. Получилось, как будто мы все тут бараны кроме тебя
О_о сколько ответов. Спасибо всем. У меня получилось вот так: PHP: public function getUser(){ $params = [ 'user_id' => 2, ]; return $this->db->all("SELECT user_id, login, message FROM comments LEFT JOIN users ON comments.user_id = user_id",$params); } В БД 2-е записи этого пользователя. Результат выборки: PHP: Array ( [0] => Array ( [user_id] => 2 [login] => Login [message] => 2222222222222222222222222222 ) [1] => Array ( [user_id] => 2 [login] => Login [message] => 3333333333333333333333333333333 ) ) В фронтенде тоже всё ок: Login 2222222222222222222222222222 Login 3333333333333333333333333333333 _ne_scaju_ Завтра просмотрю еще раз твой пост и если что-то не правильно - перепишу. Сегодня просто уже времени нет =) Если завтра у меня вопросов не будет то вопрос можно считать решенным.
@_ne_scaju_, потому, что JOIN без указания равнозначен запятой - это перекрёстное обединение таблиц и дай бог чтоб WHERE помог, поэтому всегда надо явно указывать какая таблица к какой присоединяется, для этого даже FULL OUTER есть, чтобы всем рассказать, что программист в курсе что он получит на выходе.
@GTank, ок, я записал, в следующий раз сначала подождём, что у тебя получилось, потом будем заваливать советами
Это метод в моей моделе, который потом вызывается в контроллере =) Модель PHP: <?php namespace app\models; use components\engine\base\Model; class Main extends Model { public function getUser(){ $params = [ 'user_id' => 2, ]; return $this->db->all("SELECT user_id, login, message FROM comments LEFT JOIN users ON comments.user_id = user_id",$params); } } Контроллер: PHP: <?php namespace app\controllers; use app\models\Main; class MainController extends AppController { public function indexAction() { $main = new Main(); $test = $main->getUser(); $this->set(compact('test')); } } --- Добавлено --- Отлично
Возможно. Но можно и забить. Просто запомни: нужно присоединить метаданные по id – LEFT JOIN. --- Добавлено --- Название нелогичное, говорю.