2

是否可以在 mySQL 中编写一个函数来检查 SELECT 查询的值,如果它!= 0,继续运行该函数并添加到结果数组中?

我有几个条目标记为related_id=0 其余的附有实际的正数。

我正在尝试创建一个将不断循环通过 sql 函数的单个查询,检查并查看检索到的related_id结果是否为 0。如果不是,则它将再次运行,将新检查的行添加到结果数组并继续直到找到一个 0。

DB的设置方式,总是会出现0,并且会通过id进行搜索,所以应该只有一个结果。

我正在使用稍作修改的标记系统。

keywords_id | keyword  | related_id
------------------------------------
1           | sports   | 0
2           | baseball | 1
3           | football | 1
4           | pitchers | 2

如果我传入related_id=2我希望返回一个产生的数组:

array 
[0]
   keyword => 'sports'
   keywords_id => '1'
   related_id => '0'
[1]
   keyword => 'baseball'
   keywords_id => '2'
   related_id => '1'
[2]
   keyword => 'pitcher'
   keywords_id => '4'
   related_id => '2'

我尝试了使用 IF 和 THEN 的运气,但我只是没有看到足够的示例,而且很难在网上找到可靠的教程。谢谢!

SELECT k.* 
FROM keywords k
WHERE keywords_id = 2

上面的查询基本上会启动它。keywords_idrelated_id通过的。因此以上将返回keywords_id: 2 |keyword: baseball |related_id: 1

因为related_id 1 不是0,所以我需要再次运行它。

我意识到这可以通过一些额外的查询在 PHP 中完成……我应该这样做吗?我认为它可以在阅读有关函数后在 mySQL 中完成。我只是想不通。

4

2 回答 2

1

我对上面示例的理解 - 需要检查所有记录,直到找到匹配项(上面的示例 related_id = 2 )。

如果是这样,您可以尝试使用 mysql 游标http://dev.mysql.com/doc/refman/5.0/en/cursors.html 来循环结果集。

于 2013-01-22T21:36:07.737 回答
1

MySQL 不支持从函数返回数组。建议创建一个表(或可能是一个临时表)来保存结果,然后编写一个存储过程来填充它。

不确定您要达到的具体目标,但可能与此类似?

CREATE TABLE results (keywords_id INT, keyword VARCHAR(2000), related_id INT);

CREATE PROCEDURE populateResults(IN keyword_id_in INT)
BEGIN
  DECLARE num_results INT;
  DECLARE max_results INT;
  DECLARE next_keyword_id INT;
  SET next_keyword_id = keyword_id_in;
  SET max_results = 5;
  SET num_results = 0;

  DELETE FROM results;

  the_loop: LOOP
    INSERT INTO results
    SELECT keywords_id, keyword, related_id
    FROM keywords
    WHERE keywords_id = next_keyword_id;

    SELECT related_id
    FROM keywords
    WHERE keywords_id = next_keyword_id
    INTO next_keyword_id;

    IF (next_keyword_id = 0) || (num_results >= max_results) THEN
      LEAVE the_loop;
    END IF;
    SET num_results = num_results + 1;
  END LOOP the_loop;
END

请参阅SQL Fiddle 演示

于 2013-01-22T22:20:55.060 回答