如何从第一个mysql表获取多个值并在第二个查询中使用它?

时间:2013-08-10 00:44:08

标签: php mysql sql

表1

id | author       | number_of_view |
---+--------------+-----------------
1  | john         | 10    
2  | Jack         | 20   
3  | Anna         | 80    
4  | Neri         | 100  

下面我有一个PHP脚本,它检查MySQL数据库表并为用户提供徽章。该脚本完美无缺。

$from1=10;
$to1=15;

$from2=20;
$to2=30;

$query=mysql_query("SELECT SUM( number_of_view ) AS view_number, author FROM `table1`  GROUP BY author");

 while ($row=  mysql_fetch_array($query))
        {
            $view_number=$row['view_number'];
            $author=$row['author'];


            if ($viewnumber>$from1 && $viewnumber<=$to1)
            {
                echo "special user";

            }
            elseif ($viewnumber>$from2 && $viewnumber<=$to2)
            {
                echo "plain user";
            }
        }
}

但问题是我想从数据库表中获取$from$to变量值:

表2

id | badge       | from |to
---+-------------+------+---
1  | special user| 10   |15
2  | plain user  | 20   |30

这是第二个表的第二个查询和PHP脚本:

$query2=mysql_query("SELECT * FROM table2");
while ($row= mysql_fetch_array($query2)) {
    $badgeName=$row['view_number'];
 //I would like to use this variable above. So instead of "echo 'special user';" I would like use "echo $badgeName" $from=$row['author'];
// I would like to use this variable above instead of $from1 and $from2 $to=$row['to'];
// I would like to use this variable above instead of $to1 and $to2 }

我该怎么做?

2 个答案:

答案 0 :(得分:1)

我原本以为这很简单,但我错了,因为有一些复杂的因素你必须要注意。

首先,你必须做两个表的交叉产品。最简单的方法是在FROM语句中使用两个表。你会得到这样的东西:

SELECT SUM(number_of_view) AS view_number, author, badge
FROM table1, table2

对于每个徽章,这将是第一个表中的每一行一次。我们还没有总结这些意见,所以这是我们接下来要做的事情。第一次尝试是这样的:

SELECT SUM(number_of_view) AS view_number, author, badge
FROM table1, table2
GROUP BY number_of_view

但是,您现在会看到视图计数不正确,我们每人只会看到一个徽章,而我们希望每个用户都有一个徽章。实际上,徽章也被分组,这就是为什么显示的number_of_view是实际的视图数量乘以系统中的徽章数量的原因。要解决这个问题,我们会将徽章按列添加到组中,因此不会将其压缩到其他结果中:

SELECT SUM(number_of_view) AS view_number, author, badge
FROM table1, table2
GROUP BY number_of_view, badges

如果你的第二个表有一个id列,我会使用它,因为它更适合性能(取决于用于徽章字段的实际类型),但表中没有给出,这样做工作

现在,我们需要过滤掉用户未获得的徽章,以确保只剩下正确的徽章。这将是这样的:

SELECT SUM(number_of_view) AS view_number, author, badge
FROM table1, table2
GROUP BY number_of_view, badges
HAVING number_of_view >= table2.`from`
AND    number_of_view <  table2.to

(请注意,我必须逃避,因为它是SQL中的关键字。)但是,我们会发现查询不知道table2.from列。这是因为查询的HAVING部分不会查看表(WHERE会这样做),而是查看所选列(因为这是GROUP BY过滤的内容) 。因此,我们需要将这些列添加到选定的列中:

SELECT SUM(number_of_view) AS view_number, author, badge, `from`, to
FROM table1, table2
GROUP BY number_of_view, badges
HAVING number_of_view >= table2.`from`
AND    number_of_view <  table2.to

我们终于得到了我们想要的东西。您可以在此处查看运行中的查询:http://sqlfiddle.com/#!8/e78c8/1

答案 1 :(得分:0)

您应该在两个表之间运行JOIN查询。我已经将table2字段名称从“from”和“to”修改为“start”和“end”,因为FROM是一个保留字。

SELECT author, number_of_view, badge
FROM authors LEFT JOIN scores 
ON score >start AND score < end

请注意,上面的JOIN查询将返回table1中的所有结果,即使它们在table2中没有匹配项也是如此。在这种情况下,徽章值将为NULL。如果您不想获取这些值,可以使用INNER JOIN替换LEFT JOIN。