选择所有行的计数,但输出年龄<= 30的行

时间:2013-05-26 07:07:50

标签: php mysql

"id"    "name"      "age"   "address"       "pincode"
"1"     "Peter"     "25"    "1 Elm Street"  "91550"
"2"     "James"     "30"    "2 Elm Street"  "91551"
"3"     "John"      "32"    "3 Elm Street"  "91552"
"4"     "Andrew"    "33"    "4 Elm Street"  "91553"

是否可以在此处选择所有行的计数,但只显示年龄<= 30的那些?

我只需要显示年龄<= 30的用户,并提供查看其他用户的链接。仅当有其他用户时才会显示该链接&gt; 30。

我现在使用2个选择和php来做这个。我正在寻找一种更好的方法,而不是使用2种选择。

Desidred Output

"id"    "name"      "age"   "address"       "pincode"
"1"     "Peter"     "25"    "1 Elm Street"  "91550"
"2"     "James"     "30"    "2 Elm Street"  "91551"
LINK GOES HERE -> View 2 other users //This is the diff from rows outputted and total rows

4 个答案:

答案 0 :(得分:1)

您必须使用两个查询。一个得到总数:

SELECT COUNT(*) FROM people;

选择30岁以下的用户。

SELECT * FROM people WHERE age < 30;

使用单个查询执行此操作的唯一方法是使用子选择:

SELECT (SELECT COUNT(*) FROM people) AS total_count,* FROM people WHERE age < 30;

但这并没有效率,因为你仍在执行两个语句(逻辑上,你执行的语句更多,因为SELECT COUNT(*)...语句将为每一行输出执行一次,但是你的查询优化器应该优化它,因为它们都是相同的),然后你在每一行中都有一个额外的total_count列,这是你不想要的。

答案 1 :(得分:0)

你的意思是,执行你在sql中提到的所有过程?

我认为不可能。唯一的方法是选择所有行并在循环中检查年龄是否<= 30。

答案 2 :(得分:0)

以下是查询:

SELECT p.*, (SELECT COUNT(id) FROM people WHERE age > 30) as link_count 
FROM people p  WHERE p.age <= 30

答案 3 :(得分:-1)

SELECT COUNT(*) FROM `people` WHERE `age` <= 30