繁体   English   中英

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

[英]How get multiple values from first mysql table and use it in second query?

表格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 }

我怎样才能做到这一点?

我本来以为这很简单,但是我误会了,因为您需要注意一些复杂的因素。

首先,您必须对两个表进行叉积运算。 最干净的方法是在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列,我会改用它,因为它的性能更好(这取决于用于badge字段的实际类型),但是表中没有任何东西,因为Give确实起作用。

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

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

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

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

请注意,即使表2中没有匹配项,上述JOIN查询也将返回表1中的所有结果。 在这种情况下,徽章值将为NULL。 如果您不想获得这些值,则可以用INNER JOIN替换LEFT JOIN。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM