2015-02-07 31 views
1

我有這樣一個表:檢索所有IDS其中`​​name` LIKE%current_name在一個查詢

id | name 
1 | gecko 
2 | b-gecko 
3 | c-gecko 
4 | toucan 
5 | s-toucan 

我想在一個查詢idnamelookalike領域檢索。喜歡的東西:

id | name | lookalike 
1 | gecko | 1,2,3 
4 | toucan | 4,5 

...或類似:

id | name | lookalike 
1 | gecko | 2 
1 | gecko | 3 
4 | toucan | 5 

這甚至可能嗎?我在該表中有50,000條記錄,如果逐行檢查,則需要對每條記錄進行很多簡單的查詢。

我想查詢應該是這個樣子:

SELECT t1.`id`, t1.`name`, (SELECT t2.`id` FROM `table1` t2 WHERE t2.`name` LIKE CONCAT('%', t1.`name`)) as `lookalike` FROM `table1` t1 

...但我缺少一個CONCAT。謝謝!

LE:即使使用

SELECT t1.`id`, t1.`name`, (SELECT GROUP_CONCAT(id SEPARATOR ',') FROM `table1` t2 WHERE t2.`name` LIKE CONCAT('%', t1.`name`) AND t1.name<>t2.name) as `lookalike` FROM `table1` t1 

我得到了很多服務器崩潰的由於大量行進行檢查。我知道我對LIKE有最糟糕的情況,但我試圖弄清楚如何優化這個。

對於第2個版本,我已經試過

SELECT 
    t.id, 
    t.name, 
    t2.id 
FROM 
    table1 t 
LEFT JOIN 
    table1 t2 
ON 
    t2.name LIKE CONCAT('%', t.name) 

但這個崩潰的服務器了。

+0

? – Jens 2015-02-07 14:53:08

+0

它是由一個子查詢生成的,該子查詢搜索名稱與最初一行相同的行的id ...請原諒我缺乏明確解釋,但請查看期望結果是什麼 – valicu2000 2015-02-07 14:57:47

+0

什麼是你的查詢結果? – Jens 2015-02-07 15:00:00

回答

1

Mysql有一個GROUP_CONCAT函數,它允許您將子查詢轉換爲字符串。

此外,還有包括在該行本身的外形相似的沒有用的,所以你應該過濾掉原來的動物在子查詢

這裏是你如何能做到這樣的例子。

SELECT *, 
    (SELECT GROUP_CONCAT(id SEPARATOR ', ') 
    FROM table1 
    WHERE `name` LIKE '%toucan%' 
    AND `name` != 'toucan') as lookalikes 
FROM table1 
WHERE `name` = 'toucan' 

這裏的結果將是

id | name | lookalikes 
4 | toucan | 5 
從哪裏場`lookalike`來
+0

如果使用這種方法,服務器不斷崩潰,有2.5億行被檢查:(......有沒有辦法忽略結果中的行,如果'lookalikes'爲NULL或等於''? – valicu2000 2015-02-07 15:47:34

+0

你可以看看優化我不知道你是否熟悉這個? 你可以通過使用EXPLAIN語句來做到這一點,下面是一些閱讀材料:http://dev.mysql.com/doc/refman/5.0 /en/using-explain.html – 2015-02-07 16:09:26

+0

除此之外,我並沒有真正看到按照您的方式檢索數據的重要性,我想您將再次查詢數據庫以獲取數據。 您只需檢索lookalikes的id,而不是添加原始行的名稱和id字段。在這種情況下,你可以將查詢簡化爲'SELECT GROUP_CONCAT(id)FROM test WHERE name LIKE'%toucan%' – 2015-02-07 16:18:07