2012-05-26 76 views
-1

我在DB两个不同的表,这里的相关字段:结合的MySQL查询

表图片:

CREATE TABLE `images` (
    `image_id` int(4) NOT NULL AUTO_INCREMENT, 
    `project_id` int(4) NOT NULL, 
    `user_id` int(4) NOT NULL, 
    `image_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `image_description` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `date_created` date NOT NULL, 
    `link_to_file` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `link_to_thumbnail` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `given_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `note` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`image_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=51 ; 

并表项目:

CREATE TABLE `projects` (
    `project_id` int(4) NOT NULL AUTO_INCREMENT, 
    `user_id` int(4) NOT NULL, 
    `project_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `project_description` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    `date_created` date NOT NULL, 
    `date_last_edited` date NOT NULL, 
    `shared` int(1) NOT NULL, 
    `password` varchar(255) COLLATE utf8_unicode_ci NOT NULL, 
    PRIMARY KEY (`project_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=25 ; 

我想展示在变量$ content中,每个项目中最老的图像作为该项目页面的链接,我不知道应该如何构建mysql查询。你能帮我解决这个问题吗?我已经尝试了几个if和while语句,但结果已经完全失败,而我处于我的(非常有限)知识的末尾。我都快要跳出窗口...

所以我想用

<a href="index.php?page=projects&id='.$projectid.'"> 
    <img src="oldest_photo_of_project_x" /> 
</a> 
<a href="index.php?page=projects&id='.$projectid.'"> 
    <img src="oldest_photo_of_project_y" /> 
</a> 
<a href="index.php?page=projects&id='.$projectid.'"> 
    <img src="oldest_photo_of_project_z" /> 
</a> 

UPDATE1落得:

为了澄清,我想结合:

"SELECT * FROM projects WHERE user_id='$UserID' ORDER BY project_id DESC" 

也许是这样的:

$query = "SELECT images.project_id, projects.project_name ". 
"FROM images, projects ". 
"WHERE images.project_id = projects.project_id"; 
+0

你是什么意思“的变化显示”? – eggyal

+0

@eggyal:我的意思是将结果回显到一个变量中,以便在稍后的html中执行'<?php echo $ content; ?> – PartisanEntity

+0

好的,那么这个变量需要保存的不仅仅是数据库结果 - 它需要保存结构化标记。这是不寻常的做法,我怀疑可能不是你想做的事。最好直接输出为数据库记录集上的一个循环。 – eggyal

回答

1

没有测试的错误,但我会做这样的事情:

$result = mysql_query("SELECT DISTINCT 
    `projects`.`project_id` AS `project`, 
    `images`.`link_to_file` AS `filepath` 
FROM 
    `projects`, 
    `images` 
WHERE 
    `projects`.`project_id` = `images`.`project_id` 
ORDER BY 
    `images`.`date_created` DESC"); 

while ($resultLoop = mysql_fetch_array($result)) { 
    $str .= '<a href="index.php?page=projects&id=' . $resultLoop["project"] . '"> 
     <img src="' . $resultLoop["filepath"] . '" /> 
    </a>'; 
} 


echo $str; 
+0

非常感谢!这是我正在寻找的,唯一的结果应该是限制在用户user_id这是我存储在会话中的变量,它也存储在项目和图像。 – PartisanEntity

+0

您可以将其添加到WHERE行,例如: WHERE'projects'.'project_id' ='images'.'project_id' AND'projects'.'user_id' =“。$ userid。” ORDER BY etc – Jared

+0

非常感谢,经过一些调整,这是完全按照我需要的。 – PartisanEntity

1

像这样的东西会从数据库中提取图像上的数据。

SELECT * FROM `images` WHERE `project_id`="x" ORDER BY `date_created` ASC LIMIT 1,1; 

这将为ID为'x'的项目提取最早的图像。你可以把它们连起来,如下所示:

SELECT * FROM `images` WHERE `project_id`="x" ORDER BY `date_created` ASC LIMIT 1,1; 
SELECT * FROM `images` WHERE `project_id`="y" ORDER BY `date_created` ASC LIMIT 1,1; 
SELECT * FROM `images` WHERE `project_id`="z" ORDER BY `date_created` ASC LIMIT 1,1; 

如果您使用的是PHP,你可以使用mysqli_result :: fetch_array得到它应该包含所有3次结果的查询结果。

+0

谢谢,但那不完全是我的意思。我更新了我原来的帖子。 – PartisanEntity

0
$dbh = new PDO($DSN, $USERNAME, $PASSWORD); 
$qry = $dbh->prepare(' 
    SELECT project_id, link_to_thumbnail 
    FROM  images NATURAL JOIN (
    SELECT project_id, MIN(date_created) AS date_created 
    FROM  images 
    GROUP BY project_id 
    WHERE user_id = ? 
) AS t 
    ORDER BY project_id DESC 
'); 
$qry->bindValue(1, $UserID); 
$qry->execute(); 

while ($row = $qry->fetch()) echo " 
    <a href=\"index.php?page=projects&id=$row[project_id]\"> 
    <img src=\"$row[link_to_thumbnail]\"/> 
    </a> 
"; 
+0

谢谢,现在就试试看 – PartisanEntity