2017-07-29 16 views
0

比方说,我们有如下表“文章”:如何在mysql中返回JSON字符串的值

id_article | article_title 
    1  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 
    2  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 
    3  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 
    4  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 
    5  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 
    6  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 
    7  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} 

而且我们说,我们也有如下表“看到”:

id_seen | id_item_seen 
    1 |  3 
    2 |  5 
    3 |  5 
    4 |  3 
    5 |  3 
    6 |  3 
    7 |  3 
    8 |  2 
    9 |  2 
    10 |  4 
    11 |  1 
    12 |  7 
    13 |  7 

我执行下面的SQL查询:

select articles.id_article, articles.id_article, count(*) as seens from seen 
inner join articles on articles.id_article = seen.id_item_seen 
group by articles.id_article 
order by seens desc 

这将返回以下结果:

id_article | article_title              | seens 
    1  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 1 
    2  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 2 
    3  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 5 
    4  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 1 
    5  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 2 
    6  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 0 
    7  | {"ar":"Arabic value", "en":"English value", "tr":"Turkish value"} | 2 

这是好的,但我想不是所有的返回存储的JSON {}的,但所需的关键的只是一个特定值(例如:“AR”),如下所示:

 1  | Arabic value | 1 
    2  | Arabic value | 2 
    3  | Arabic value | 5 
    4  | Arabic value | 1 
    5  | Arabic value | 2 
    6  | Arabic value | 0 
    7  | Arabic value | 2 

我知道我们可以用PHP使用json_decode()函数来做到这一点,但是我们怎样才能用SQL查询来实现呢?

+0

你的MySQL版本? – Mihai

+0

我的MySQL版本是5.6.35 –

回答

1

在mysql中使用SBTRING_INDEX < 5.7。用你的列名取代json。

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('{"ar":"Arabic value", "en":"English value", "tr":"Turkish value"}','ar":"',-1),'"',1) 

See it working.

+1

Hola!这就是我要找的!非常感谢! <3 –

1

如果你使用MySQL 5.7和列是JSON类型的(因为它应该是)你可以

select articles.id_article, articles.article_title->'$.ar', count(*) as seens from seen 
inner join articles on articles.id_article = seen.id_item_seen 
group by articles.id_article 
order by seens desc 

documentation of the JSON type检索。

如果你有一个老版本的MySQL,那么最好是在服务器之外处理提取以确保它的处理正确。

+0

OOOOOOHHH :-(我的mysql版本是5.6.35 我看到它是不可执行的查询 但是,谢谢:-) –