Php 显示每个用户的三个图像
我有一个图片表,用户的图片保存与他们的ID和图片物理链接Php 显示每个用户的三个图像,php,mysql,loops,picturegallery,Php,Mysql,Loops,Picturegallery,我有一个图片表,用户的图片保存与他们的ID和图片物理链接 userID | picture 1 | picnameLink 1 | picnameLink 2 | picnameLink 1 | picnameLink 2 | picnameLink 3 | picnameLink 现在,我想在jquery图片库块中最多显示3张图片,其中一个块应显示来自同一用户的所有3张图片,如果用户的图片少于3张,则不应
userID | picture
1 | picnameLink
1 | picnameLink
2 | picnameLink
1 | picnameLink
2 | picnameLink
3 | picnameLink
现在,我想在jquery图片库块中最多显示3张图片,其中一个块应显示来自同一用户的所有3张图片,如果用户的图片少于3张,则不应显示图像文本
我曾经尝试过使用GROUPBYMySQL查询,但没有得到理想的结果。我必须使用两个循环吗
-编辑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
编辑:要一次为每个用户显示三个图像,我将使用我的第一个查询,并从以下代码开始:
<?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显示您尝试过的代码。然后告诉我们它在做什么,以及它与您希望它做的有什么不同。我没有看到任何代码,但您应该做的是编辑原始帖子并将其粘贴到那里。对不起,安迪,我刚刚用代码编辑了我的主要问题,因为我是新来的。我没有任何答案,但我只是第一个说给我们看代码的人。@travis从第一个开始?但第一个是不是像页码一样?所以,如果first=0,则显示第一个用户的image1、image2、image3或空图像,first=1显示第二个用户的image1、image2、image3?这是否总是从一行中选取.picture值?我担心p1.picture可能会选择与p3.picture不同的分组行,从而导致它们相同。很好,但假设它是100,是否有替代Alized联接的方法?@dagon我编辑并添加了一个替代方法,它使用变量,因此它不是标准SQL,但仅在MySql@ebyrob对不起,我不明白。。。p1.userid、p2.userid和p3.userid总是相同的,图片总是不同的,所以它们总是在不同的行上。。。我认为对于这个非常好的解决方案来说+1应该是可以的。。。我只是在摆弄同样的东西:哦