MySQL:查询两个值的存在

时间:2012-01-09 14:09:51

标签: php mysql optimization

我的表格包含字段idtexttitle。可能有多个行具有相同的titletitle不唯一)。此外,id是主键。

我只需要知道是否至少有一行title =“A”包含text中的字符串“aaa”,另外至少有一行{{1} } =“B”,其中包含title中的字符串“bbb”。

这就是我的尝试:

text

我曾计划用PHP解析字符串“aaa”和“bbb”的mysql> SELECT (SELECT text FROM table WHERE title = 'A') as aText, (SELECT text FROM table WHERE title = 'B') as bText; aText的值。但是,我有两个问题:

1)主要问题:由于bText不唯一,子查询可能会返回多行。 MySQL打破了这个错误:

title

2)小问题:我在PHP中解析的原因是为了避免使用MySQL的LIKE运算符。我会更好地在MySQL中解析字符串吗:

ERROR 1242 (21000): Subquery returns more than 1 row

4 个答案:

答案 0 :(得分:2)

SELECT (SELECT count(*) FROM table WHERE title='A') AS A_count,
    (SELECT count(*) FROM table WHERE title='B') AS B_count
WHERE (A_count > 0) AND (B_count > 0)

这将返回1行(带有计数),如果“A”或“B”不存在则不返回行。

将数据返回到父查询中的字段的子查询只能返回单个值。您基本上用查询结果替换了字段名,这意味着查询结果必须与普通表字段的行为相同。因此,“返回超过1行”错误 - 您将返回“A”或“B”匹配的所有行,这不是单个字段 - 它是一列。

答案 1 :(得分:2)

如果你只是想知道这些行是否存在,你可以这样做:

SELECT COUNT(1)
FROM table
WHERE (title = 'A' AND text = '%aaa%')
OR (title = 'B' AND text = '%bbb%')

- 编辑 -

根据您的评论,您可能需要尝试以下查询:

SELECT COUNT(1), title
FROM table
WHERE (title = 'A' AND text = '%aaa%')
OR (title = 'B' AND text = '%bbb%')
GROUP BY title

检查两行,COUNT(1)大于零。

答案 2 :(得分:1)

你可以自我加入:

SELECT t1.text as `atext`, t2.text as `btext`
table as t1, table as t2
WHERE t1.title = 'A' AND t1.text LIKE '%aaa%' AND t2.title = 'B' AND t2.text LIKE '%bbb%';

如果你想在php中进行解析,只需要留下where语句,但是如果你在php中做的事情等同于mysql的声明,我不知道为什么你不会在查询中这样做。

答案 3 :(得分:0)

回答一个人自己的问题可能不是一个好的形式,但为了精美的档案而牺牲了我的业力:

我使用的查询是:

SELECT count(*) FROM (
    SELECT DISTINCT title FROM (
        SELECT title, text FROM table WHERE title IN ('A', 'B')
    )
    AS filtered
    WHERE (title='A' AND text LIKE '%aaa%')
       OR (title='B' AND text LIKE '%bbb%')
)
AS allResults;

最里面的查询获得具有良好标题的所有内容,下一个查询获得真实结果的不同标题。此设置确保LIKE子句不会在整个表上运行。然后我将所有这些包装在一个计数中,如果if等于2,那么我知道每个条件都已满足。

感谢所有贡献的人,我从你的答案中获得了很多见解!