MySQL:一个连接可以做到吗?


MySQL: Can a join do the trick?

我有那些表:

------------------------
- user:
----- id    
----- name     
------------------------
- user_has_element:
----- user_id     
----- element_id     
------------------------
- element:
----- id
----- name
----- price
------------------------

我的目标是创建一个函数,它接受用户名和一些元素名,并返回传递给它的每个元素的以下信息:

  • name:元素名称
  • 价格:元素价格
  • isOwned:元素是否为给定用户所拥有

例如,假设用户John有3个元素E.A E.B e.c

如果我用以下参数调用函数:

    name: John
    elements: E.A, E.B, E.C, E.D

它应该返回一个像这样的数组:

        0:
            - name: E.A                            
            - isOwned: 1
        1:
            - name: E.B                            
            - isOwned: 1
        2:
            - name: E.C                            
            - isOwned: 1
        3:
            - name: E.D                            
            - isOwned: 0                       

现在,我得到的只是一个返回用户拥有的元素的查询:

select e.name as elementName
from user u
inner join user_has_element h on h.user_id=u.id
inner join element e on e.id=h.element_id
where
    u.name='AAA'
    and
    (
        e.name='E.A'
        or
        e.name='E.B'
        or
        e.name='E.C'
    ) 

从那里,我知道如何在一些php代码的帮助下实现我的目标,但我想知道这是否可能与mysql只有?

是的,您可以首先从元素表中选择,然后使用LEFT JOIN从那里与子查询来检查名称传递的user_id。假设函数获取如下php变量:

$user = 'John';
$elements = array('E.A', 'E.B', 'E.C', 'E.D');
$elements = implode("','",$elements);

你的SQL可以看起来像这样:

$sql = "
    SELECT 
        e.name as elementName,
        e.price as elementPrice,
        (h.element_id IS NOT NULL) as isOwned
    FROM element e
    LEFT JOIN user_has_element h ON
    (
        h.element_id = e.id 
        AND h.user_id =
        (
            SELECT id 
            FROM user u
            WHERE u.name '" . $user . "'
        )
    )
    WHERE e.name IN ('" . $elements . "')
    ";

当然,不要忘记转义变量以避免SQL注入。