2015-03-13 26 views
-2

我在兩個表上運行選擇查詢並用等號搜索匹配的條目。在我的理解中,MySQL應該只返回條目完全匹配WHERE條件,但是這就像當我使用LIKE語句返回條目:爲什麼MySQL等號會匹配錯誤的條目?

enter image description here

爲什麼會在第一行被返回的結果的任何解釋查詢?

編輯:

這裏的查詢:

SELECT `ts`.`ticker_symbol`, `sm`.`id` AS `matchescount`, `sm`.`ticker_symbol_ids` 
FROM `mk_ticker_symbols` `ts`, `mk_submissions` `sm` 
WHERE `sm`.`ticker_symbol_ids` = `ts`.`id` AND `ts`.`id` = "1506" 

編輯2: 這裏的SQL小提琴: http://sqlfiddle.com/#!9/5550b/1/0

編輯3: 這裏的SQL撥弄連接: http://sqlfiddle.com/#!9/5550b/2/0

+2

我無法讀取查詢,你可以把文本在你的問題。 – dan08 2015-03-13 15:25:14

+0

您應該考慮升級到ANSI-92連接。 http://my.vertica.com/docs/6.0.x/HTML/index.htm#15163.htm – 2015-03-13 15:31:35

+0

我沒有在這個查詢中全部使用JOIN,我需要精確匹配和高性能以及保持查詢簡單。毫無疑問,JOIN工作正常,但不清楚爲什麼這個查詢不能正確工作。 – Piero 2015-03-13 15:33:57

回答

0

我不能給對問題的完整解釋,但我有一個解決方案。

ts.id很可能和INTEGER所以你的where子句應該是

`ts`.`id` = 1506 

(請從數引號)。你

也應該使用一個連接,而不是一個where子句匹配表:

FROM `mk_ticker_symbols` `ts` 
JOIN `mk_submissions` `sm` on sm.ticker_symbol_ids = ts.id 
+0

使用不帶引號的整數返回相同的結果。我爲什麼要使用JOIN?這個查詢應該按預期工作,或者爲什麼沒有? – Piero 2015-03-13 15:39:11

+0

JOINs更快更好。對兩個查詢運行EXPLAIN。 – dan08 2015-03-13 15:40:24

+0

我真的不在尋找其他解決方案,但想知道爲什麼這個失敗。 – Piero 2015-03-13 15:52:56

2

皮耶羅, 的一個使用連接可以被糾正。 CAST()JOIN將解決此問題。

INNER JOIN `mk_submissions` `sm` 
    ON `sm`.`ticker_symbol_ids` = CAST(`ts`.`id` AS CHAR(10)) 

我知道你不是在尋找解決方案,但我仍然發佈它。

問題是非常有趣的。 我在網上搜索,並在我的數據庫上做了一些試錯。我沒有任何解釋...... 我試着把1506,放在逗號分隔列表中的第二位或第三位 - 查詢工作正常。 所以,我有一種感覺,如果用逗號分隔的列表JOIN,逗號被視爲通配符「字符串結尾」...

如果您找到解釋,請將其發佈到此處。

+0

非常感謝您在發佈反饋之前查看問題的根源。它確實看起來像逗號就像通配符,不僅具有顯式JOIN,而且具有隱式的JOIN,例如SELECT - FROM table1,table2。這可能是MySQL中的一個錯誤。也許我應該報告它。如果我找到解釋,我一定會回覆。 – Piero 2015-03-13 16:33:26

2

evaluating expressions,MySQL將這兩個參數(在本例中)轉換爲浮點數來比較它們。這是因爲一個是字符串,一個是整數,導致上面鏈接中的最終條件被應用。

在所有其他情況下,將參數作爲浮點數 (實數)進行比較。

那麼什麼是字符串「1506,...」的浮點等價?

運行我的測試服務器上執行以下操作:在

SELECT "1506,3101,26673,26745,2277,1216,26847,26865,20711,1468,26947,233,20539,26985"+0.0 

結果:

1506 

這當然等於整數浮點版本1506

所以,一切都按預期行事。至少,假設您期望這種浮點比較正在發生。

0

我找到了這個問題的答案。我比較字符串到整數位置:

`sm`.`ticker_symbol_ids` =`ts`.`id`和'ts`.`id` = 「1506」

的問題是即將其轉換爲內部整數以便進行比較: 1506,3101,26673,26745,2277,1216,26847,26865,20711,1468,26947,233,20539,26985

由於逗號,MySQL認爲它是帶浮點數的小數或浮點數,並且忽略逗號後面的所有內容以進行比較。因此,它變成1506而不是1506,3101,26673,26745,2277,1216,26847,26865,20711,1468,26947,233,20539,26985,並且與WHERE條件匹配。

@cyadvert和@Willem_Renzema是絕對正確的。

要解決此問題 我只需要:

CAST(`ts`.`id` AS CHAR)

相關問題