MySQL:获取用户组及其所有成员

时间:2016-02-23 11:39:08

标签: mysql performance select

我的表格包含以下表格,其中包含群组及其成员。

+---------+----+-------+
| group   | p  | state |
+---------+----+-------+
| group a | p1 |     3 |
| group a | p2 |     1 |
| group a | p3 |     0 |
| group a | p4 |     3 |
| group b | p1 |     1 |
| group b | p2 |  NULL |
| group b | p3 |     3 |
| group c | p2 |     1 |
| group c | p3 |  NULL |
| group c | p4 |     3 |
+---------+----+-------+

我想获取p1所属的所有群组及其成员。

我想出了这个

select group, p from `groups` where group in (select DISTINCT group from `groups` where p = "p1")

每个组的比例约为100,000个用户,用户可以是任意数量的组的一部分。 有没有更有效的方法呢?

2 个答案:

答案 0 :(得分:0)

您可以尝试自我加入:

    //Creating a new calendar
    net.fortuna.ical4j.model.Calendar calendar = new net.fortuna.ical4j.model.Calendar();
    calendar.getProperties().add(new ProdId("-//Ben Fortuna//iCal4j 1.0//EN"));
    calendar.getProperties().add(Version.VERSION_2_0);
    calendar.getProperties().add(CalScale.GREGORIAN);

    TimeZoneRegistry registry = TimeZoneRegistryFactory.getInstance().createRegistry();
    TimeZone timezone = registry.getTimeZone("Etc/GMT");

    //Creating an event
    java.util.Calendar startCal = java.util.Calendar.getInstance(timezone);
    startCal.set(java.util.Calendar.YEAR, 2005);
    startCal.set(java.util.Calendar.MONTH, java.util.Calendar.NOVEMBER);
    startCal.set(java.util.Calendar.DAY_OF_MONTH, 1);
    startCal.set(java.util.Calendar.HOUR_OF_DAY, 15);
    startCal.clear(java.util.Calendar.MINUTE);
    startCal.clear(java.util.Calendar.SECOND);

    java.util.Calendar endCal = java.util.Calendar.getInstance(timezone);
    endCal.set(java.util.Calendar.YEAR, 2005);
    endCal.set(java.util.Calendar.MONTH, java.util.Calendar.NOVEMBER);
    endCal.set(java.util.Calendar.DAY_OF_MONTH, 1);
    endCal.set(java.util.Calendar.HOUR_OF_DAY, 19);
    endCal.clear(java.util.Calendar.MINUTE);
    endCal.clear(java.util.Calendar.SECOND);

    net.fortuna.ical4j.model.DateTime dtStart = new DateTime (startCal.getTime());
    dtStart.setUtc(true);

    net.fortuna.ical4j.model.DateTime dtEnd = new DateTime (endCal.getTime());
    dtEnd.setUtc(true);

    VEvent event = new VEvent(dtStart,dtEnd, "Test Event");

答案 1 :(得分:0)

如果'p1'只能出现在每个组中,那么您可以进行简单的连接: -

snprintf