0

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

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)

它的意思是

汤姆属于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;   
}
4

1 回答 1

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

教义 DQL。请注意,我从未尝试过这个,但它似乎类似于 Hibernate。更多信息,请参阅Doctrine ORM 文档

Select u.username, sa.label
from User u
JOIN SmallArea sa
于 2013-07-11T03:13:32.970 回答