2012-05-12 33 views
0
我有這個SQL麻煩

選擇數據:它有着相同的字母

$sql = mysql_query("SELECT $menucompare , 
    (COUNT($menucompare) * 100/(SELECT COUNT($menucompare) 
    FROM data WHERE $ww = $button)) AS percentday FROM data WHERE $ww >0 "); 
  • $menucompare是選擇什麼都字段表中的字段名稱,幷包含波紋管
  • $button數據是選擇的週數(可以說周「6」)
  • $ww表字段名稱與行數有周數'6'

例如,我有數據$menucompare這樣的:

123456bool 
521478bool 
122555heel 
147788itoo 

,我要選擇那些,誰在最後的數據具有相同的字,使百分比。

輸出應該是這樣的:

  • BOOL - 50%(2條目)
  • 鞋跟 - 25%(1個條目)
  • itoo - 25%(1個條目)

任何對我的SQL清晰度將非常感激。 我沒有發現任何類似的東西。

+0

你有什麼錯誤(如果有的話)? $ menucompare究竟是什麼?它是一個包含逗號分隔字段名稱的字符串嗎?或者它是一個字段名稱的數組? –

+0

'menucompare'字段是否真的有這樣的複合數據?因爲現有的SQL不會嘗試將每個值與單詞分開。 –

+0

我沒有得到任何錯誤,但錯誤的百分比。而$ menucompare是表字段名稱。好吧,讓它變得簡單,只需menucompare即可,並且可以說它的表字段名稱 –

回答

3

那麼,以這種格式保存數據可能不是最好的方法,如果可能的話,將字段拆分爲2個單獨的字段。

首先,您需要從字段的末尾提取字符串部分。

  • 如果字符串/數字部分的長度是固定的,那麼很容易;
  • 如果沒有,你應該使用正則表達式,不幸的是,這些正則表達式在默認情況下並不存在於MySQL中。有一個解決方案,檢查這個問題:How to do a regular expression replace in MySQL?

我會假設,即數字部分是固定的:

SELECT s.str, CAST(count(s.str) AS decimal)/t.cnt * 100 AS pct 
    FROM (SELECT substr(entry, 7) AS str FROM data) AS s 
    JOIN (SELECT count(*) AS cnt FROM data) AS t ON 1=1 
GROUP BY s.str, t.cnt; 

如果你有regexp_replace功能,然後substr(entry, 7)應及時更換,regexp_replace(entry, '^[0-9]*', '')實現所需的結果。可以測試here的變體。

+0

是的,我認爲乞討的數字部分的入口存在固定。其餘的處理信件。 – vyegorov

+0

子查詢具有別名's'和't'。 's.str'是你想要分析的子字符串。 't.cnt'是表中條目的總數。 – vyegorov

+0

我不知道正確的表名。我爲您提供了一個示例SQL,並在SQL Fiddle上設置了一個測試用例。我希望你可以根據你的需要調整提供的解決方案。 – vyegorov

2

當整理出這樣的問題,我會做的兩個步驟:

  1. 理清SQL獨立演示語言(PHP?)。
  2. 在知道您獲得了正確的查詢後,對查詢的參數化和結果的顯示進行分類。

由於此問題被標記爲'SQL',因此我只會解決第一個問題。

的第一步是要整理的查詢:

SELECT menucompare, 
     (COUNT(menucompare) * 100/(SELECT COUNT(menucompare) FROM data WHERE ww = 6)) 
      AS percentday 
    FROM data 
WHERE ww > 0; 

這消除從最可變的比特$跡象,和替代品6爲按鈕值。這使它更容易理解。

您所需的輸出似乎需要保存在menucompare中的字符串的最後四個字符用於分組和計數目的。

SELECT SUBSTR(MenuCompare, -4) AS Last4 
    FROM Data 
WHERE ww = 6 

的比例除數是這樣的行數,但分穿線不必指望他們,所以我們可以這樣寫:

成爲彙集的數據將被選擇:

SELECT COUNT(*) FROM Data WHERE ww = 6 

這正是你無論如何。

百分比中的divdend將是每個子字符串的組計數。

SELECT Last4, COUNT(Last4) * 100.0/(SELECT COUNT(*) FROM Data WHERE ww = 6) 
    FROM (SELECT SUBSTR(MenuCompare, -4) AS Last4 
      FROM Data 
     WHERE ww = 6 
     ) AS Week6 
GROUP BY Last4 
ORDER BY Last4; 

當您演示了這種方法時,您可以重新參數化查詢並處理結果的表示。

+0

如何在上一個查詢的最後一個查詢中使用了last4?或者你已經結合了這些查詢? –

+0

我已經使用了這個最新的查詢,我得到這個錯誤'每個派生表都必須有它自己的別名' –

+0

'FROM子句中的子查詢'給它的單個結果列命名爲'Last4';子查詢生成一個結果'表名'或'Week6'的別名和唯一的列'Last4'。如果省略了「AS Week6」部分,那麼您報告的錯誤消息('每個派生表必須具有其自己的別名')纔是準確的。那(Week6)是派生表的別名。 「AS」是可選的,但名稱不是。 –

相關問題