我有那些表:
------------------------
- user:
----- id
----- name
------------------------
- user_has_element:
----- user_id
----- element_id
------------------------
- element:
----- id
----- name
----- price
------------------------
我的目标是创建一个带有用户名和一些元素名称的函数, 并返回有关传递给它的每个元素的以下信息:
例如,假设用户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才有可能?
答案 0 :(得分:1)
是的,您可以先从元素表中进行选择,然后使用带有子查询的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注入。