我的表格包含字段id
,text
和title
。可能有多个行具有相同的title
(title
不唯一)。此外,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
答案 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,那么我知道每个条件都已满足。
感谢所有贡献的人,我从你的答案中获得了很多见解!