Вывести только один результат запроса с использованием PHP и mySQL?

Я работаю с MySQL и PHP и натолкнулся на вопрос, который заставляет задуматься весь день. Я не уверен, что мои трудности связаны с незнанием какой-либо команды продвинутого уровня, которая может быть запрошена для этого, не могли бы вы помочь?

Вот в чем дело: я работаю со старой базой данных и не хочу менять таблицы в ней, поэтому мне пришлось работать с двумя таблицами:

  • album: в этой таблице только два поля: id_album и album_name;
  • фотографии: эта таблица содержит пути к фотографиям и связана с таблицей альбомов полем id_album;

Я хочу создать страницу, на которой будут перечислены все альбомы, и у каждого будет миниатюра, которую я беру из таблицы «фото», в этом случае мне нужно перечислить только одну фотографию для каждого альбома, и я Я не уверен, как написать код для этого, это то, что я получил до сих пор:

  <?php

$comando = "SELECT * FROM album";

$consulta = mysql_query($comando, $database)

or die('Error:<br/>'.$comando);

while($dados = mysql_fetch_array($consulta)) {$comando1 = "SELECT * FROM photos WHERE album = '".$dados['id_album']."'";
$consulta1 = mysql_query($comando1, $database)
or die('Error'.$comando1);

while($dados1= mysql_fetch_array($consulta1)){
print '<li><a href="photos.php?Cod='.$dados['id_album'].'"><img src="'.$dados1['foto'].'"/></a><br/><a href="photos.php?Cod='.$dados['id_album'].'"> ' .$dados['album_name']. '</a></li>';

}}

?>

Он работает правильно, но он перечисляет все фотографии во всех альбомах. Есть ли способ, которым я могу напечатать только одну фотографию для каждого альбома?

Большое спасибо заранее!

0

Решение

$comando1 = "SELECT * FROM photos WHERE album = '".$dados['id_album']."' LIMIT 1";

Вы должны присоединиться к запросам. Используйте что-то вроде

$comando = "SELECT album.id_album, photos.* FROM `album`
LEFT JOIN `photos` on photos.album = album.id_album
GROUP BY album.id_album";
1

Другие решения

while($dados = mysql_fetch_array($consulta)) {

$comando1 = "SELECT * FROM photos WHERE album = '".$dados['id_album']."' LIMIT 1 order by rand()";
$consulta1 = mysql_query($comando1, $database) or die('Error'.$comando1);

$dados1= mysql_fetch_row($consulta1);
print '<li><a href="photos.php?Cod='.$dados['id_album'].'"><img src="'.$dados1['foto'].'"/></a><br/><a href="photos.php?Cod='.$dados['id_album'].'"> ' .$dados['album_name']. '</a></li>';

}

Но вы действительно должны использовать MySqli или что-то еще ..

0

Да, вы используете один запрос с GROUP_CONCAT чтобы получить фотографии альбома и SUBSTRING_INDEX выбрать одну фотографию

SELECT a.* ,SUBSTRING_INDEX(GROUP_CONCAT(p.foto),',',1) AS foto
FROM album a
LEFT JOIN photos p ON(a.id_album = p.id_album)
GROUP BY a.id_album

Вы также можете указать ORDER BY в GROUP_CONCAT по вашему столбцу автоматического увеличения в таблице фотографий, чтобы выбрать последний или первый как GROUP_CONCAT(p.foto ORDER BY p.id DESC). Также как Тадман упомянул в комментариях вы используете устарела mysql_* семейные функции лучше начинать с PDO

<?php

$dbh = new PDO('mysql:host=yourhost;dbname=dbname', 'user', 'pass');
$sth = $dbh->prepare("SELECT a.* ,SUBSTRING_INDEX(GROUP_CONCAT(p.foto),',',1) AS foto
FROM album a
LEFT JOIN photos p ON(a.id_album = p.id_album)
GROUP BY a.id_album
");
$sth->execute();
$result = $sth->fetchAll();

foreach($result as $res){

echo '<li><a href="photos.php?Cod='.$res['id_album'].'"><img src="'.$res['foto'].'"/></a><br/><a href="photos.php?Cod='.$res['id_album'].'"> ' .$res['album_name']. '</a></li>';
}
?>

PDO::errorInfo

Также во время разработки вы должны позаботиться об ошибках перед выполнением

$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES,false);
if (!$sth) {
echo "\nPDO::errorInfo():\n";
print_r($dbh->errorInfo());
}
0
По вопросам рекламы [email protected]