我有那些表:
------------------------
- 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注入。