从四个表的组合中选择用户数据

时间:2013-07-11 02:44:08

标签: sql doctrine-orm

我有多个表格,例如 这有点复杂。

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;   
}

1 个答案:

答案 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