Mysql子查询或更好的方法

时间:2019-02-11 16:30:24

标签: mysql

我对mysql有点陌生,我在如何最好地编写以下查询方面遇到问题。假设我有一个包含datetime列的表格以及其他一些我要搜索的表格。因为这只是一个表,所以我认为这里的join语句不合适(但是我可能做错了,因为我没有以join语句的方式做很多事情),我认为这里需要一个子查询。因此,我的初始查询是根据用户输入的搜索字符串搜索表,然后我希望将其限制为用户也以HTML格式指定的日期时间(开始日期和结束日期)。

表架构

id, datetime, host, level, message

我想先选择任何包含$ searchstring的行,例如...

SELECT * FROM $table WHERE (level LIKE '%$searchstring%') OR (message LIKE '%$searchstring%') LIMIT $offset,$limit

如果我也想通过datetime列来限制上述结果,查询将看起来像这样……

SELECT * FROM $table WHERE (datetime >='$startdate') AND (datetime < '$enddate')

如何最好地将这些查询合并为一个查询,这样我就可以首先获取与搜索查询匹配的任何行,然后再按开始和结束日期时间限制行?

TIA

3 个答案:

答案 0 :(得分:1)

您可以通过使用单个where条件来实现。 就您而言:

 dealsImagesRecyclerView = 
 findViewById(R.id.dealsImagesRecyclerView);
    layoutManager = new
            PreCachingLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    layoutManager.setExtraLayoutSpace(deviceHeight);
    layoutManager.setItemPrefetchEnabled(true);
    dealsImagesRecyclerView.setLayoutManager(layoutManager);

答案 1 :(得分:0)

您不必使用JOIN,而只需添加条件

SELECT * 
FROM $table 
WHERE (level LIKE '%$searchstring%' OR message LIKE '%$searchstring%')
AND
datetime >='$startdate'
AND datetime < '$enddate'
LIMIT $offset,$limit

答案 2 :(得分:0)

您可以简单地使用UNION

SELECT *
FROM $table
WHERE (level LIKE '%$searchstring%')
OR (message LIKE '%$searchstring%')
LIMIT $offset,$limit
UNION
SELECT *
FROM $table
WHERE (datetime >='$startdate')
AND (datetime < '$enddate')

Mysql将为您处理重复的行,并首先将带有搜索字符串的行带入。如果您需要为整个结果集规定一个限制或根据您的条件进行其他排序,则可以将其变成子查询并从中选择/限制。