1

我有一个包含文章和股票信息的数据库(两个表)。输入文章 id 时,我从文章表中选择文章,做一些其他的事情,然后查看库存表(如果文章可用)。

这可能很容易SELECT * FROM articles,但是:我的articles表有一个字段parent_id。如果已设置,我应该选择父行。让我举例说明:

+----+-----------+---------+---------+
| id | parent_id | article | country |
|----|-----------|---------|---------+
|  1 |           | abc     | uk      |
|  2 |           | cde     | us      |
|  3 |           | efg     | can     |
|  4 | 6         | hij     | mex     |
|  5 |           | klm     | bra     |
|  6 |           | nop     | us      |
|  7 | 8         | qrs     | mex     |
|  8 |           | tuv     | uk      |
+----+-----------+---------+---------+

如果我搜索 article abc,它应该返回英国国家的第 1 行。如果我正在搜索hij,查询应该返回第 6 行,国家为 US 而不是第 4 行,国家为 mex。有什么方法可以在 MySQL 中执行此操作,还是更快/更好/使用 PHP 将其拆分为两个查询的唯一方法?

4

4 回答 4

1

你可以使用 mysql IF Conditionals Mysql docs

但是,您很快就会得到一个难以调试的邪恶 sql 语句。使用多个查询和 php if 可能会更快/更容易解决。

有一个替代选项,您可以编写视图或存储过程来为您实现它,但在收益方面再次受到质疑。

于 2013-01-25T10:34:15.883 回答
1

您可以使用LEFT外部连接来完成:

SELECT 
    COALESCE(p.id, a.id) AS id
  , COALESCE(p.country, a.country) AS country 
FROM 
        articles AS a
    LEFT JOIN 
        articles AS p
            ON p.id = a.parent_id 
WHERE
    a.article LIKE '%hij%' ;          -- or:  a.article = 'hij'
于 2013-01-25T10:37:24.440 回答
0

如果函数我认为 IFNULL 是你所追求的函数,你可以使用 MySQL 。

IFNULL(parent_id, id)
于 2013-01-25T10:33:23.423 回答
0

您可以使用 LEFT JOIN SELECT a2.id, a2.country FROM 文章 a1 LEFT JOIN 文章 a2 ON (a2.id = a1.parent_id) WHERE a1.article = 'hij';

于 2013-01-25T10:40:37.397 回答