2015-07-21 91 views
1

我的數據庫結構是我使用來獲得結果這個需要幫助,以顯示記錄

ID | wine_name | wine_description | wine_type | size_id |country_id 

SQL查詢

SELECT * FROM winemeta WHERE wine_name LIKE '%cab%' ORDER BY wine_name ASC

下面是連接搜索表單圖像

enter image description here

你可以看到t他搜索結果。當我用單詞「cab」搜索所有與cab表演相關的結果時,酒名爲ASC

要求是,我需要顯示ASC命令的結果以及Alphabatic命令。

在搜索結果1991年1992年2001年有相同的名稱,以便接受結果,我需要的是
1991城堡Monteiena駕駛室
1992年的城堡Monteiena駕駛室
2001城堡Monteiena駕駛室
1992年達拉山谷駕駛室
1995年達拉山谷駕駛室
Dalla Valle駕駛室

請幫助我解決這個問題。

+0

結果已經在orderby –

+0

葡萄酒年份欄在哪裏? – Strawberry

+0

葡萄酒年沒有列所有名稱和存儲在wine_name –

回答

2

這是不使用任何第三方庫。

SELECT wine_name FROM winemeta order by SUBSTR(wine_name, LENGTH(CONVERT(wine_name, SIGNED)) + 1) asc, CONVERT(wine_name, SIGNED) asc 

我在上面的查詢中發現了一些毛刺。這是修改的。

SELECT 
    wine_name 
FROM 
    winemeta 
where 
    wine_name like '%cab%' 
order by SUBSTR(wine_name, 
    if(CONVERT(wine_name , SIGNED) > 0, 
     LENGTH(CONVERT(wine_name , SIGNED)) + 2, 
     1)) asc , CONVERT(wine_name , SIGNED) asc 
+0

這正是我正在尋找。感謝您的幫助 –

+0

你可以請給我一個小解釋它是如何工作的? –

+0

這裏是詳細的查詢。應該解釋一切 SELECT wine_name, CONVERT(wine_name,SIGNED)AS num_part, SUBSTR(wine_name, 如果(CONVERT(wine_name,SIGNED)> 0, LENGTH(CONVERT(wine_name,SIGNED))+ 2, 1))AS通過SUBSTR rest_of_string FROM winemeta 其中 wine_name LIKE '%駕駛室%' 順序(wine_name, 如果(CONVERT(wine_name,SIGNED)> 0, LENGTH(CONVERT(wine_name,SIGNED))+ 2 , 1))asc,CONVERT(wine_name,SIGNED)asc –

0

我認爲這些SQL對你有用。

SELECT * FROM winemeta WHERE wine_name LIKE '%cab%' 
order by HEX(wine_name) ASC 

謝謝。

+0

它不能按預期結果工作 –

+0

對不起,我更新了我的答案,檢查一次。 –

+0

十六進制方法不符合OP的預期結果。鑄造方法是什麼與結果相匹配 –

1

Mysql不會爲我們提供替換的正則表達式。而對於這一點,你必須創建一個函數:

  1. 首先執行以下功能到你的數據庫:

    DELIMITER $$ CREATE FUNCTION regex_replace(模式VARCHAR(1000),更換VARCHAR(1000 ),原始VARCHAR(1000))

    RETURNS VARCHAR(1000) DETERMINISTIC BEGIN DECLARE溫度VARCHAR(1000); DECLARE ch VARCHAR(1); DECLARE i INT; SET i = 1; SET temp =''; IF原始REGEXP模式THEN loop_label:LOOP 如果i> CHAR_LENGTH(original)然後 LEAVE loop_label;
    END IF; SET ch = SUBSTRING(original,i,1); IF NOT ch REGEXP pattern THEN SET temp = CONCAT(temp,ch); ELSE SET temp = CONCAT(temp,replacement); END IF; SET i = i + 1; END LOOP; ELSE SET temp = original; END IF; RETURN temp; END $$ DELIMITER;

這將創建一個功能到你的數據庫之後,你可以用這個功能到你的查詢爲:

SELECT * FROM winemeta WHERE wine_name LIKE '%cab%' ORDER BY regex_replace('[0-9]+','', wine_name) ASC; 
+0

我使用這個查詢作爲一個從PHP的SQL命令我需要使用這個命令,你已經在數據庫中給出 –

+0

是的,你是正確的,在MySQL上沒有正則表達式默認 –

+0

是的,你必須執行這個命令在分貝不在php查詢 – Solutionswithus