У меня есть таблица изображений, в которой фотографии пользователей сохраняются с их идентификатором и физической ссылкой.
userID | picture 1 | picnameLink 1 | picnameLink 2 | picnameLink 1 | picnameLink 2 | picnameLink 3 | picnameLink
Теперь я хочу показать максимум 3 снимка в блоке галереи jquery picture gallery, где один блок должен показывать все 3 снимка от одного и того же пользователя, и если у пользователя меньше 3 изображений, он не должен показывать текст изображения.
Я попытался сделать с группой запрос mysql, но я не получаю желаемого результата. Должен ли я использовать две петли?
–Edit для fthiella– Вот код
$query = "SELECT * FROM pictures GROUP BY userID"; $result = mysql_query($query); while($row = mysql_fetch_array($result)){ $image_array[] = $row['picLink']; $id_array[] = $row['pic_id']; } $num_images_to_display = 3; /* MODIFY TO REFLECT NUMBER OF IMAGES TO SHOW PER SCREEN */ $num_images = count($image_array); $image_path = "../images/"; /* MODIFY TO REFLECT THE PATH TO YOUR IMAGES */ $y = $num_images_to_display; if(!isset($_GET['first'])){ $first = 0; }else{ $first = (int) $_GET['first']; } $x = $num_images - 1; $z = $x - $y; if($first>$z) { $first = $z; } $last = $first + $num_images_to_display;
И вот область HTML:
<div style="position:absolute; top:50px; left:100px; width:800px; text-align: center;"> <?PHP $i = $first; while($i<$last) { $showme = $image_path . $image_array[$i]; ?> <?php if($image_array[$i]!="") { ?><img src="<?PHP echo $showme; ?>" width="176px" height="197px"><?php } else { ?><img src="../image/no_image.jpg" width="176px" height="197px"><?PHP } ?> $prev = $first-1; $next = $first +1; if($prev<0){ $prev = 0; } ?> </div>
Результат этого запроса показывает изображения в группах, но я хочу, чтобы максимум три изображения каждого пользователя, где изображение не отображается, если у пользователя меньше трех изображений.
Я не знаю, есть ли лучшее решение, но я думаю, вы могли бы использовать это:
SELECT p1.userID, p1.picture as pic1, p2.picture as pic2, p3.picture as pic3 FROM pictures p1 left join pictures p2 on p1.userID=p2.userID and p1.picture<>p2.picture left join pictures p3 on p1.userID=p3.userID and p1.picture<>p3.picture and p2.picture<>p3.picture GROUP BY p1.userID
Это позволит выбрать три изображения для каждого пользователя. Если у пользователя меньше трех изображений, он отображает нули, если у него больше, он выбирает три из них.
Альтернативой, которая показывает три изображения в каждой строке, является этот запрос, который использует переменные:
SELECT userid, picture FROM ( SELECT userid, picture, case when @prec_id=userid then @row:=@row+1 else @row:=1 end as row, @prec_id:=userid FROM `pictures`, (SELECT @prec_id:=0, @row:=0) s ORDER BY userid) s WHERE row<=3
EDIT: чтобы показать три изображения для каждого пользователя за раз, я бы использовал свой первый запрос, и я бы начал с некоторого кода следующим образом:
<?php $mysqli = new mysqli("localhost", "username", "password", "test"); $image_path = "../images/"; $no_image = "../image/no_image.jpg"; if(!isset($_GET['first'])){ $first = 0; } else { $first = (int) $_GET['first']; } if ($stmt = $mysqli->prepare("SELECT p1.userID, p1.picture as pic1, p2.picture as pic2, p3.picture as pic3 FROM pictures p1 left join pictures p2 on p1.userID=p2.userID and p1.picture<>p2.picture left join pictures p3 on p1.userID=p3.userID and p1.picture<>p3.picture and p2.picture<>p3.picture GROUP BY p1.userID LIMIT ?,1")) { $stmt->bind_param("i", $first); $stmt->execute(); $stmt->bind_result($user, $pic1, $pic2, $pic3); $stmt->fetch(); $stmt->close(); } $mysqli->close(); ?> <div style="position:absolute; top:50px; left:100px; width:800px; text-align: center;"> <img src="<?PHP echo (isset($pic1) ? $image_path.$pic1 : $no_image); ?>" width="176px" height="197px"> <img src="<?PHP echo (isset($pic2) ? $image_path.$pic2 : $no_image); ?>" width="176px" height="197px"> <img src="<?PHP echo (isset($pic3) ? $image_path.$pic3 : $no_image); ?>" width="176px" height="197px"> </div>
(он был улучшен, но вы можете начать с него. Я использую mysqli вместо mysql)