Нужен селект многие ко многим итого у нас есть: авторы->один ко многим->статьи-> многие ко многим(статьи_тэги)->тэги Возможно ли выбрать одним запросом чтобы были статьи с автором и тэгами? (то есть получился статья с авторами и ещё все тэги к каждой статье) я придумал только два запроса в первом выбираем статьи с авторами PHP: $sql = "SELECT * FROM authors INNER JOIN articles ON authors.id = articles.author_id WHERE authors.id='$author_id' ORDER BY articles.id DESC"; во втором выбираем к каждой статье теги Код (Text): $sql = "SELECT tag,tag_id FROM articles JOIN articles_tags ON articles.id = articles_tags.article_id JOIN tags ON articles_tags.tag_id = tags.id WHERE articles.id='$articleId' ";
Если таблиц три, то и объединить можно сразу три. Запрос будет, правда, монструозный. Нечитаемый, прям, как в вашем коде. Если позже понадобится внести правки, сделать это будет непросто. Есть проще решение - создайте два представления с объединением по две таблицы, и объединяйте уже их.
Понятно. Сбила с толку использованная вами терминология. Вам нужно объединить три таблицы. Чтобы облегчить задачу желающим вам помочь, покажите структуры этих таблиц, и какие именно колонки из них нужно вывести.
нужно чтобы был вывод все статьи где указан автор и несколько тэгов у каждой статьи, то есть объединить три таблицы, тривиальная задача у статьи может быть только один автор и несколько тэгов это нужно всё в одном запросе сделать, можно ли это сделать7
я не понимаю какая разница какая структура таблиц от этого зависит код чтоли? автор: айди, имя, фамилия статья: заголовок, текст, автор_айди тэг_статья: айди_статьи, айди_тэга тэг: айди, тэг
Уже здесь ошибка: авторы и статьи должны быть тоже в отношении многие-ко-многим. Может быть и статья с несколькими авторами, и один автор может иметь несколько статей. --- Добавлено --- конечно --- Добавлено --- Ну окей, допустим у тебя такая ограниченная версия где у статьи возможен только один автор. Тогда объединить твои два запроса из первого сообщения, можно как-то так: Код (SQL): SELECT articles.*, authors.first_name, authors.last_name, gt.tag_names FROM articles JOIN authors ON authors.id = articles.author_id JOIN ( SELECT articles_tags.article_id, GROUP_CONCAT(tags.tag) AS tag_names FROM articles_tags JOIN tags ON articles_tags.tag_id = tags.id GROUP BY articles_tags.article_id ) AS gt ON articles.id = gt.article_id WHERE authors.id='$author_id' ORDER BY articles.id DESC Ты бы упростил нам работу, если бы создал заготовку с данными на db-fiddle !!!
Госпади как всё сложно то, в ларавел элоквендом это решается в одну строку кода, неужели в sql так всё сложно та, вот пхп прям с сидерами PHP: <?php mysqli_report(MYSQLI_REPORT_STRICT); $connect = mysqli_connect("localhost", "root", "","lesson_bd"); $tableName = 'authors'; $sql = "CREATE TABLE $tableName ( id int NOT NULL AUTO_INCREMENT PRIMARY KEY, firstname VARCHAR(40) NOT NULL, lastname VARCHAR(40) NOT NULL, email VARCHAR(40) NULL, password VARCHAR(40) NOT NULL, token VARCHAR(40), user_type VARCHAR(10) NOT NULL, token_expired TIMESTAMP, reg_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; // if(mysqli_query($connect, $sql)){ echo 'sucsess'; }else{ echo 'unsucsess'.mysqli_error($connect); } $firstnames = ['Alexander','Alexey','Sergey','Vladimir']; $lastnames = ['Ivaniv','Petrov','Sidorov']; $quantity = 16; for ($i=0; $i<$quantity; $i++){ $firstname= $firstnames[mt_rand(0,count($firstnames)-1)]; $lastname= $lastnames[mt_rand(0,count($lastnames)-1)]; $password = mt_rand(0,100000); $email = $password.'@mail.ru'; $password = hash('sha1',$password); $userType = 'user'; $sql = "INSERT INTO $tableName SET firstname='$firstname', lastname='$lastname', email='$email',password='$password', user_type ='$userType'"; if(!mysqli_query($connect, $sql)){ echo 'ошибка'.mysqli_error($connect); } } mysqli_close($connect); PHP: <?php mysqli_report(MYSQLI_REPORT_STRICT); $connect = mysqli_connect("localhost", "root", "","lesson_bd"); $tableName = 'articles'; $sql = "CREATE TABLE $tableName ( id int NOT NULL AUTO_INCREMENT PRIMARY KEY, title VARCHAR(40) NOT NULL, text TEXT NOT NULL, author_id INT NOT NULL, FOREIGN KEY (author_id) REFERENCES authors (id) ON DELETE CASCADE, date TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"; if(mysqli_query($connect, $sql)){ echo 'sucsess'; }else{ echo 'unsucsess'.mysqli_error($connect); } $text = 'Израильские ракеты сносят многоэтажки с целыми арабскими семьями в Газе, палестинские повстанцы расстреливают евреев в упор, ни щадя ни женщин, ни детей. Родственные народы снова сошлись в междоусобной схватке, но тот, кто заварил всё это действо, вновь остаётся за кадром. Вадим ЕГОРОВ Чужие на своей земле По русским социальным сетям пошло гулять выражение: "ХАМАС за сутки занял больше территории, чем ВСУ за четыре месяца". И это правда. В ходе лихого партизанского наскока бойцы этой палестинской исламистской организации не только с лёгкостью одолели возведённую Израилем между ним и Палестинской автономией стену, закидав её вышки с автоматическими пулемётами минами с дронов, но и серьёзно углубились на израильскую территорию. Развеяв по ветру миф о непобедимой израильской армии, которая, как оказалось, может хорошо делать тик-токи с симпотными еврейскими девочками с оружием в руках. А вот реагировать на внезапную атаку врага – не очень. В то время как весь западный мир бросил все свои силы на поддержку Украины и войну с Россией, в чём негласно участвовал, надо отметить, и Израиль, произошла атака, которую никто не ожидал. И продвижение на более чем 35 километров вглубь страны, что позволило взять под контроль территорию, превосходящую по масштабам саму Газу. Ради борьбы с несправедливостью, которую транслировал Израиль все эти годы, – прокомментировал Царьграду рывок ХАМАСа директор Центра мониторинга евразийских проблем Аслан Рубаев. И действительно, несправедливости людям, называющим себя палестинцами, пришлось хлебнуть сполна. Всё началось более полувека назад, когда им внезапно объявили, что земля, на которой они родились и где поколениями жили их предки, вовсе не их земля. И теперь там будут жить просвещённые люди из Европы, пострадавшие от геноцида, а вы извините – подвиньтесь, у вас родни – весь север Африки и целая Аравия, небось приютят. '; $quantity = 16; $authors= 13; for ($i=0; $i<$quantity; $i++){ $start = mt_rand(0,mb_strlen($text)-1); $raznica = mb_strlen($text)-$start; $length = mt_rand(0,$raznica); $textArticle = mb_substr($text,$start,$length); $author_id = mt_rand(1,$authors); $title = mb_substr($text, $start,40); $sql = "INSERT INTO $tableName SET text='$textArticle', author_id='$author_id', title='$title'"; if(!mysqli_query($connect, $sql)){ echo 'ошибка'.mysqli_error($connect); } } mysqli_close($connect); PHP: <?php mysqli_report(MYSQLI_REPORT_STRICT); $connect = mysqli_connect("localhost", "root", "","lesson_bd"); $tableName = 'tags'; $tagsStatic = ['свежее','смешное','спорт','политика']; $sql = "CREATE TABLE $tableName ( id int NOT NULL AUTO_INCREMENT PRIMARY KEY, tag VARCHAR(40) NOT NULL )"; if(mysqli_query($connect, $sql)){ echo 'sucsess'; }else{ echo 'unsucsess'.mysqli_error($connect); } foreach($tagsStatic as $value){ $sql = "INSERT INTO $tableName SET tag='$value' "; if(!mysqli_query($connect, $sql)){ echo 'ошибка'.mysqli_error($connect); } } $tableName = 'articles_tags'; $sql = "CREATE TABLE $tableName ( article_id int NOT NULL, tag_id int NOT NULL, FOREIGN KEY (article_id) REFERENCES articles (id) ON DELETE CASCADE, FOREIGN KEY (tag_id) REFERENCES tags (id) ON DELETE CASCADE, primary key(article_id, tag_id) )"; if(mysqli_query($connect, $sql)){ echo 'sucsess'; }else{ echo 'unsucsess'.mysqli_error($connect); } //для каждой статьи создаём тэги $articles = 'SELECT * FROM articles'; $articles = mysqli_query($connect, $articles); $articles = mysqli_fetch_all($articles,MYSQLI_ASSOC); //создаём массив с индексами которые есть в массиве $tagsStatic for($i=0; $i<count($tagsStatic); $i++){ $tagsShuffle[] = $i+1; } foreach ($articles as $article){ $article_id = $article['id']; $tagQuantity = mt_rand(1,count($tagsStatic));//количесвто тэгов от 1 shuffle($tagsShuffle);//перемешиваем массив с индексами $tagsArticle = [];// каждый раз обнуляем и заносим рандомные индексы в массив $tagQuantity - количесвто тэгов for($i=0; $i<$tagQuantity; $i++){ $tagsArticle[]=$tagsShuffle[$i]; } foreach ($tagsArticle as $value){ $sql = "INSERT INTO $tableName SET article_id='$article_id', tag_id='$value' "; if(!mysqli_query($connect, $sql)){ echo 'ошибка'.mysqli_error($connect); } } } mysqli_close($connect);
Нет. Для упрощения именно запроса, создайте заранее два представления (http://www.mysql.ru/docs/gruber/mg20.html) объединяющих по две таблицы, и объединяйте их