簡體   English   中英

需要幫助來構造具有某個結果+隨機結果的查詢

[英]need help to construct a query with one certain result + random result

我需要有關如何構造將根據條件返回5個結果的查詢的幫助。
在這5個結果中,如果在查詢中指定了記錄,則其中之一必須始終出現。
其余的將被隨機選擇。

我有表格COUNTRY,CATEGORY,QUESTIONS
對於國家,我有記錄:加拿大,中國,法國,德國,日本,美國
對於CATEGORY,我有以下記錄:大寫,地標,標志,語言

每個問題都根據CATEGORY和COUNTRY進行分類。
現在,我希望每當選擇一個國家時,類別“ CAPITAL”中的一個問題就始終出現在結果中。
因此,如果我選擇FRANCE,則必須選擇5個關於法國的問題,其中一個結果的類別為CAPITAL,其他4個是隨機選擇的。

我的解決方案是有兩個問題,但我不知道這是否正確:

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

SELECT * FROM QUESTIONS WHERE COUNTRY = "FRANCE" AND CATEGORY != "CAPITAL" ORDER BY RAND() LIMIT 4

然后只需附加結果即可。
我也從某個地方聽說過使用RAND()函數有一個缺點,因為它必須先對記錄進行排序才能選擇隨機記錄。 因此,如果您有成千上萬的記錄,則不好用。
因此,如果有更好的方法可以做到這一點,並且任何人都可以提供幫助,我將不勝感激。
提前致謝。

為什么不添加另一列來表明該行具有更高的優先級?

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

更新

我一直在建議同樣的解決方案。 好的,我會嘗試詳細說明。 最好的IMO是在表中添加一列“粘滯”(在您的情況下為QUESTIONS)。

ALTER TABLE `QUESTIONS` ADD COLUMN `sticky` TINYINT NOT NULL DEFAULT 0;

然后將需要回答的問題標記為粘性(為此創建管理界面,或者自己運行原始查詢)

UPDATE `QUESTIONS` SET `sticky` = IF(`CATEGORY` = "CAPITAL", 1, 0);

然后選擇這樣的問題:

SELECT *
FROM `QUESTIONS`
WHERE `COUNTRY` = "FRANCE"
ORDER BY `sticky` DESC, RAND()
LIMIT 5;

最好使一個管理UI來指定關於哪些問題屬於粘性的條件,並在添加一個問題后再運行它。 非常適合經常選擇的人。 如果經常添加新問題,那么最好將條件直接放入ORDER子句中(不需要再添加該列),或者將列添加到類別表中並加入它。

#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;

這與你的非常相似,但對我來說看起來很好:

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

另一種方法是查詢中的CASE語句:

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

但是我想執行兩個查詢實際上更快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM