我有多个表格,例如 这有点复杂。
1)普通用户表
User
id|username
0 |Tom
1 |Dad
2 |Bob
2)区域的两个表
SmallArea
id|name |bigarea
0 |blockA | 0(prefA)
1 |blockB | 0(prefA)
2 |blockC | 1(prefB)
3 |blockD | 1(prefB)
4 |blockE | 2(prefC)
3)区域的两个表
BigArea
id | name
0 | prefA
1 | prefB
2 | prefC
意味着
blockA和blockB属于prefA
blockC和blockD属于prefB
blockE属于prefC
4)用户和小区域连接表
AreaConnection
user_id|smallarea
0(Tom) | 0(blockA)
0(Tom) | 1(blockB)
1(Dad) | 2(blockC)
1(Dad) | 3(blockD)
2(Bob) | 3(blockD)
意味着
Tom属于blockA和blockB
爸爸属于blockC和blockD
Bob属于blockD
然后 假设我有BigArea键0(表示prefB)
我想选择属于名为prefB的bigarea的块的用户。
(prefB有blockC和blockD,
然后爸爸和鲍勃属于blockC或blockD,
所以应该选择爸爸和鲍勃)
我怎么能在SQL中编写这个模式? Doctrine2更好,例如
SELECT u.id,u.username
FROM User u
INNER JOIN ??????
这些是我的实体。
class User.php
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer",unique=true)
* @ORM\Id
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $username;
/**
* @ORM\ManyToMany(targetEntity="Acme\UserBundle\Entity\SmallArea")
* @ORM\JoinTable(
* joinColumns={@ORM\JoinColumn(name="areaid", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")}
* )
*/
protected $SmallArea;
}
class BigArea
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer",unique=true)
* @ORM\Id
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $label;
/**
*
* @ORM\OneToOne(targetEntity="Acme\UserBundle\Entity\SmallArea", mappedBy="prefecture")
*/
private $prefecture;
}
class SmallArea{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(type="string")
*/
private $label;
/**
*
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\BigArea", inversedBy="prefecture*removethis : name of the variable in BigArea.php*")
* @ORM\JoinColumn(referencedColumnName="id",nullable=false)
*/
private $prefecture;
}
答案 0 :(得分:1)
Select *
from User
Inner Join AreaConnection on AreaConnection.userid = User.id
Inner Join SmallArea on SmallArea on SmallArea.id = AreaConnection.smallarea
Inner Join BigArea on BigArea.id = SmallArea.bigarea
Doctrine DQL。请注意,我从未尝试过这个,但它似乎与Hibernate相似。 有关更多信息,请参阅Doctrine ORM Documentation
Select u.username, sa.label
from User u
JOIN SmallArea sa