PHP: $TagByPostId = $pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID = IN ('$articlesResult')"); Так?
почитайте чуть чуть про MySql http://dimonchik.com/sql-in.html это сильно ускорит понимание как это все работает.
Чёрт. Это я код не правильно вставил. В начале я всё нормально написал - PHP: $TagByPostId=$pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN ('$articlesResult')");
конкатенацию и сложный синтаксис --- Добавлено --- PHP: $TagByPostId=$pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN (" . array_values($articlesResult) . ")"); а вообще если через PDO работаете то лучше через плейсхолдеры данные добавляйте
Может так нужно? PHP: $TagByPostId=$pdo->query("SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN (' . array_values($articlesResult) . ')"); (одинарные кавычки в новой части кода) Если да, то ничего не поменялось и, как я понял, мне нужно "почитать про конкатенацию и сложный синтаксис"?)
Тогда у меня ошибка - Fatal error: Uncaught PDOException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Array' in 'where clause' in адрес\function.php:36 Stack trace: #0 адрес\function.php(36): PDO->query('SELECT * FROM `...') #1 адрес\index.php(9): getArticlesByTags(Array) #2 {main} thrown in адрес\function.php on line 36 ('SELECT * FROM `...') - разве не из-за кавычек? Или с массивом что-то не то?
е.... тысяча извинений)) в функцию IN надо не массив засылать)) а значения)) я привык что у меня в движке можно массивы отправлять)) попробуйте вот так вот) PHP: $TagByPostId=$pdo->query( "SELECT * FROM `articleTags` AS l LEFT JOIN `tags` AS t ON(l.tagID = t.id) WHERE l.articleID IN (" . implode(',', array_values($articlesResult)) . ")");
Передаю $articlesResult - это массив который я получаю в другой функции - PHP: function getArticles(){ connectPDO(); global $pdo; $articlesResult = $pdo->query("SELECT `id` FROM `article` ORDER BY `id`"); return resultToArrayArticle($articlesResult ); } function resultToArrayArticle($articlesResult ){ $array = array(); while ($row = $articlesResult ->fetch( PDO::FETCH_ASSOC )){ $array[] = $row; } return $array; }
вы чета много очень про теги написали. это ж простая штука. и выборки там просые как палка. и можно даже без джоинов.
с джоинами нагляднее)) можно и такую запись Код (Text): SELECT * FROM tags, prom WHERE tags.id = prom.id но джоины красивее выглядят.. я вот только что - что обнаружил... в PDO такая конструкция передачи в IN параметров не работает) Код (Text): $array = [0, -1]; $stmt = $db->prepare("SELECT * FROM smf_membergroups WHERE min_posts IN (:myarray)"); $stmt->execute(array( 'myarray' => implode(', ', array_values($array)), )); надо формировать или текстовую переменную и напрямую вставлять в запрос.. или генерировать динамические плесхолдеры, ставить их в запрос и биндить тоже через массив динамически созданный..
я имел в виду вообще без джоинов забрали из таблицы связей номера тегов по статье, забрали из таблицы тегов их названия. Два запроса, никто не умер. Победа.
А эти два запроса можно в одну функцию поместить? Такого типа - PHP: function getArticles(){ connectPDO(); global $pdo; $articlesResult = $pdo->query("SELECT `id` FROM `article` ORDER BY `id`"); return resultToArrayArticle($articlesResult ); } function resultToArrayArticle($articlesResult ){ $array = array(); while ($row = $articlesResult ->fetch( PDO::FETCH_ASSOC )){ $array[] = $row; } return $array; }
мало ли чего подсказали сделай себе синглтон и насуй в него методов типа resultToArrayArticle() и живи счастливо а то с этим глобалом натрахаешься потом --- Добавлено --- https://en.wikipedia.org/wiki/Singleton_pattern
Спасибо. А что по поводу - "я имел в виду вообще без джоинов забрали из таблицы связей номера тегов по статье, забрали из таблицы тегов их названия. Два запроса, никто не умер. Победа.". Можете пример какой нибудь скинуть, пожалуйста?