Php 需要帮助以一个特定结果+随机结果构造查询吗

Php 需要帮助以一个特定结果+随机结果构造查询吗,php,mysql,sql,Php,Mysql,Sql,我需要关于如何构造一个根据条件返回5个结果的查询的帮助。 在这5个结果中,如果在查询中指定,则必须始终显示其中一个记录。 其余的将随机抽取 我有国家、类别和问题的表格 对于我有记录的国家:加拿大、中国、法国、德国、日本、美国 第一类有记录:首都、地标、旗帜、语言 每个问题根据类别和国家进行分类。 现在,我希望无论何时选择一个国家,结果中都会出现一个带有类别资本的问题。 因此,如果我选择法国,必须选择5个关于法国的问题,其中一个结果具有类别大写字母,另外4个是随机选择的 我的解决方案是有两个问题,

我需要关于如何构造一个根据条件返回5个结果的查询的帮助。 在这5个结果中,如果在查询中指定,则必须始终显示其中一个记录。 其余的将随机抽取

我有国家、类别和问题的表格 对于我有记录的国家:加拿大、中国、法国、德国、日本、美国 第一类有记录:首都、地标、旗帜、语言

每个问题根据类别和国家进行分类。 现在,我希望无论何时选择一个国家,结果中都会出现一个带有类别资本的问题。 因此,如果我选择法国,必须选择5个关于法国的问题,其中一个结果具有类别大写字母,另外4个是随机选择的

我的解决方案是有两个问题,但我不知道是否正确:

SELECT * FROM QUESTIONS WHERE COUNTRY = "FRANCE" AND CATEGORY = "CAPITAL"

然后添加结果。 我还从某个地方听说,使用RAND函数有一个缺点,因为它必须先对记录进行排序,然后才能选择随机记录。因此,如果您有数千条记录,那么使用它是不好的。 因此,如果有更好的方法来做这件事,如果有人能帮忙,我会非常感激。
提前谢谢。

这与您的非常相似,但我觉得很好:

Select * from Colors where ColorName = 'Green'
UNION
SELECT * FROM (Select * from Colors where ColorName != 'Green' order by Rand() limit 4)

为什么不添加另一列以指示该行具有更高的优先级

Select * from Colors order by priority DESC, Rand() limit 5
或者,如果有非常具体的条件,您可以这样编码:

SELECT * FROM Colors
ORDER BY IF(ColorName = 'Green', 100, IF(_other_conds_if_any_, 99, 0)) DESC,
    Rand()
LIMIT 5
SELECT *
FROM `QUESTIONS`
WHERE `COUNTRY` = "FRANCE"
ORDER BY `sticky` DESC, RAND()
LIMIT 5;
更新

我一直在建议同样的解决方案。好的,我会再详细阐述一下。 在我看来,最好的办法是在您的表格中添加一个列,该列可能是问题

ALTER TABLE `QUESTIONS` ADD COLUMN `sticky` TINYINT NOT NULL DEFAULT 0;
然后将所需的问题标记为sticky,并为此制作管理UI,或者自己运行原始查询

UPDATE `QUESTIONS` SET `sticky` = IF(`CATEGORY` = "CAPITAL", 1, 0);
然后选择如下问题:

SELECT * FROM Colors
ORDER BY IF(ColorName = 'Green', 100, IF(_other_conds_if_any_, 99, 0)) DESC,
    Rand()
LIMIT 5
SELECT *
FROM `QUESTIONS`
WHERE `COUNTRY` = "FRANCE"
ORDER BY `sticky` DESC, RAND()
LIMIT 5;
最好创建一个管理UI来指定问题的粘性条件,并在添加问题后运行它。这对频繁选择很有好处。如果经常添加新问题,则最好直接将条件放入顺序子句中,而无需添加该列,或者将该列添加到类别表中并将其联接

#1. don't add any column and put condition into ORDER clause
SELECT *
FROM `QUESTIONS`
WHERE `COUNTRY` = "FRANCE"
ORDER BY IF(`CATEGORY` = "CAPITAL", 1, 0) DESC, RAND()
LIMIT 5;

#2. add column to categories table
SELECT q.*
FROM `QUESTIONS` q
    INNER JOIN `CATEGORIES` cat ON (cat.`CATEGORY_NAME` = q.`CATEGORY`)
    #unsure what your conditions would be here as Idon't know your DB structure
WHERE q.`COUNTRY` = "FRANCE"
ORDER BY cat.sticky DESC, RAND()
LIMIT 5;

另一种方法是在查询中使用CASE语句:

SELECT *,
  CASE ColorName
    WHEN 'green' THEN 2
    ELSE RAND()
  END AS r
FROM Colors ORDER BY r DESC LIMIT 5

但我想做两个查询实际上更快。

它不是特别的“绿色”。它可以是任何其他颜色,只要它在查询中,它必须以4个随机值出现在结果中colors@user949000然后,它说明了我建议的第一个选项——添加一列来指示行的粘性状态。该列将默认为0,如果您从管理端计划多个粘性行,则可以将其设置为1或更多。@Slava,条件已更改。你能帮我一下吗。我编辑了我的问题。@user949000我仍然建议相同的解决方案:。请参阅更新的答案。