如何在mysql中从一列中选择多个记录(行)?

4
我想从这些id中显示四个项目的名称: 我可以这样做吗?
SELECT item_name from items WHERE item_id IN ('001', '012', '103', '500')

或者

SELECT item_name from items WHERE item_id = '001' or item_id = '012' or item_id = '103' or item_id = '500'

回答所有问题

好的,大多数答案都说它可以工作,但实际上并不起作用。这是我的代码:

$query = "SELECT `item_name` from items WHERE item_id IN('s001','a012','t103','p500')";

$result = mysql_query($query, $conn) or die (mysql_error());
$fetch =  mysql_fetch_assoc($result) or die (mysql_error());
$itemsCollected = $fetch['item_name'];
echo $itemsCollected;

item_id 是由字母和数字组成的。


当然,这两个都可以。测试起来很容易,你为什么不试一下呢? - jdigital
这是你提出的与 http://stackoverflow.com/questions/544673/how-to-do-this-query-in-mysql 完全相同的问题,而且这里并没有真正的问题,因为你所要求的完全是可以实现的,只需要尝试一下就能知道。我投票支持关闭。 - Paolo Bergantino
尝试了很多次,只有一个结果。这就是为什么我要发布这个问题的原因。 - roa3
它不起作用了。我急需帮助。 - roa3
5个回答

10
你可以选择其中一种方式,但是对于任何大型查询来说,使用IN查询更加高效。我曾经进行过一些简单的测试,结果显示使用IN结构要快大约10倍。如果你问的是语法是否正确,那么是的,看起来没问题,除了缺少分号来完成语句。
编辑:看起来你实际上问的问题是“为什么这些查询只返回一个值”。嗯,看着你发布的示例代码,问题在这里:
$fetch = mysql_fetch_assoc($result) or die (mysql_error());
$itemsCollected = $fetch['item_name'];
echo $itemsCollected;

你需要循环遍历并迭代,直到没有更多的结果需要获取,就像Pax指出的那样。请参考PHP手册页面mysql_fetch_assoc
$sql = "SELECT item_name from items WHERE item_id IN('s001','a012')";
$result = mysql_query($sql);

if (!$result) {
    echo "Could not successfully run query ($sql) from DB: " . mysql_error();
    exit;
}

if (mysql_num_rows($result) == 0) {
    echo "No rows found, nothing to print so am exiting";
    exit;
}

// While a row of data exists, put that row in $row as an associative array
// Note: If you're expecting just one row, no need to use a loop
// Note: If you put extract($row); inside the following loop, you'll
//       then create $userid, $fullname, and $userstatus
while ($row = mysql_fetch_assoc($result)) {
    echo $row["userid"];
    echo $row["fullname"];
    echo $row["userstatus"];
}

mysql_free_result($result);

4

是的,这两种方法都应该可以正常工作。您实际遇到的问题是什么?

如果像您所说的只返回了一条记录,请尝试:

select item_name from items order by item_id

请检查完整的输出,确保你有001、012、103和500的条目。

如果这两个查询只返回一行,我怀疑不是这样。

如果它们都存在,请检查表定义,可能是该列为CHAR(4),其他位置包含空格。你可能真的发现了MySQL中的一个错误,但我不太确定。

编辑后:

这是一个perl/mysql问题,而不是SQL问题:mysql_fetch_array() 一次只返回一行数据集,并移动到下一行。

你需要做类似以下的操作:

$query = "SELECT item_name from items WHERE item_id IN('s001','a012')";
$result = mysql_query($query, $conn) or die (mysql_error());
if (mysql_num_rows($result) == 0) {
    echo "No rows found, nothing to print so am exiting";
    exit;
}
while ($row = mysql_fetch_assoc($result)) {
    echo $row["item_name"];
}

只返回一个结果。即只显示id 001 - roa3
好的,那很可能是具有这些 item_id 的行数。012、103 和 500 在表中存在吗? - paxdiablo
执行 "SELECT item_name from items order by item_id" 并检查。 - paxdiablo
所有的ID都存在于数据库中。 - roa3

0

你的ID字段必须设置为自动递增,我猜。我曾经遇到过这样的问题,我将自动递增更改为int类型。在IN字段中,如果您传递参数以匹配自动递增变量,则仅返回第一个参数,其余会生成错误。


0
使用mysql_fetch_assoc获取查询结果,并将mysql_fetch_assoc查询中的值分配到一个数组中。就这么简单。
$i=0;
$fullArray = array();

$query = mysql_query("SELECT name FROM users WHERE id='111' OR id='112' OR id='113' ")or die(mysql_error());

while($row = mysql_fetch_assoc($query)){
    foreach ($row as $value) {
        $fullArray[$i] = $value;
    }
    $i++;
}

var_dump($fullArray); 

echo $fullArray[0]."<br/>".$fullArray[1]."<br/>".$fullArray[2];`

0

你也可以使用mysql_num_rows函数来告诉你查询检索到了多少行,然后使用该结果来增加for循环。以下是一个例子。

$num_rows=mysql_num_rows($query_results);
for ($i=0; $i <$num_rows ; $i++) { 
    $query_array[]=mysql_fetch_assoc($query_results);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接