Php 通过多个MySql数据库使用Jquery复选框数组进行搜索?

Php 通过多个MySql数据库使用Jquery复选框数组进行搜索?,php,jquery,mysql,Php,Jquery,Mysql,我一直在慢慢地学习和建立我的小搜索系统——但我似乎被这个棘手的问题困住了 我有许多事件的关系数据库。每个事件都可以在事件\u音乐\u样式表中存储多个音乐样式。events\u music\u STYLE表有自己的ID列、EVENT\u ID和music\u STYLE\u ID 当音乐样式和事件一起在另一个表中引用时,如何(通过使用复选框数组)在事件表中搜索音乐样式 这就是我到目前为止所做的: HTML <input type="checkbox" class="group1" id="c

我一直在慢慢地学习和建立我的小搜索系统——但我似乎被这个棘手的问题困住了

我有许多事件的关系数据库。每个事件都可以在事件\u音乐\u样式表中存储多个音乐样式。events\u music\u STYLE表有自己的ID列、EVENT\u ID和music\u STYLE\u ID

当音乐样式和事件一起在另一个表中引用时,如何(通过使用复选框数组)在事件表中搜索音乐样式

这就是我到目前为止所做的:

HTML

<input type="checkbox" class="group1" id="checkbox1" value="latino">Latino<BR />
<input type="checkbox" class="group1" id="checkbox2" value="rock">Rock<BR />
<input type="checkbox" class="group1" id="checkbox3" value="oldies">Oldies<BR />
<input type="checkbox" class="group1" id="checkbox4" value="reggae">Reggae<BR />

<div id="AnswerField"></div>
和一个包含完整数据库的简单PHP表(如果有帮助的话)

以下是create table语句:

SET FOREIGN_KEY_CHECKS=0;

-- Drop table locations
DROP TABLE IF EXISTS `locations`;

CREATE TABLE `locations` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `LOCATION` varchar(50),
  `LOCATION_SK` varchar(50) CHARACTER SET utf8,
  PRIMARY KEY(`ID`)
)
ENGINE=INNODB;

-- Drop table music_styles
DROP TABLE IF EXISTS `music_styles`;

CREATE TABLE `music_styles` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `MUSIC_STYLE_NAME` varchar(50),
  `MUSIC_STYLE_NAME_SK` varchar(50) CHARACTER SET utf8,
  PRIMARY KEY(`ID`)
)
ENGINE=INNODB;

-- Drop table venue_types
DROP TABLE IF EXISTS `venue_types`;

CREATE TABLE `venue_types` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `TYPE_NAME` varchar(50),
  `TYPE_NAME_SK` varchar(50) CHARACTER SET utf8,
  PRIMARY KEY(`ID`)
)
ENGINE=INNODB;

-- Drop table venues
DROP TABLE IF EXISTS `venues`;

CREATE TABLE `venues` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `VENUE_TYPE` int(11),
  `VENUE_LOCATION` int(11),
  `VENUE_NAME` varchar(50),
  `ADDRESS` varchar(255),
  `ICON_URL` varchar(100),
  `PAGE_URL` varchar(100),
  `LAT` int(100),
  `LNG` int(100),
  `VENUE_CLOSE_T_MO` varchar(50),
  `VENUE_CLOSE_T_TU` varchar(50),
  `VENUE_CLOSE_T_WE` varchar(50),
  `VENUE_CLOSE_T_TH` varchar(50),
  `VENUE_CLOSE_T_FR` varchar(50),
  `VENUE_CLOSE_T_SA` varchar(50),
  `VENUE_CLOSE_T_SU` varchar(50),
  `BEER_PRICE` int(11),
  `WINE_PRICE` int(11),
  `SPIRITS_PRICE` int(11),
  `IF_COFFEE` int(1) DEFAULT '1',
  `IF_DRAFT_BEER` int(1) DEFAULT '0',
  `IF_TEA` int(1) DEFAULT '1',
  `IF_HOT_CHOCOLATE` int(1) DEFAULT '0',
  `IF_BILLIARD` int(1) DEFAULT '0',
  `IF_HOOKAH` int(1) DEFAULT '0',
  `IF_OUTDOOR_PATIO` int(1) DEFAULT '0',
  `IF_OUTDOORS` int(1) DEFAULT '0',
  `IF_NON_SMOKING_AREA` int(1) DEFAULT '0',
  PRIMARY KEY(`ID`),
  CONSTRAINT `Ref_01` FOREIGN KEY (`VENUE_TYPE`)
    REFERENCES `venue_types`(`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Ref_02` FOREIGN KEY (`VENUE_LOCATION`)
    REFERENCES `locations`(`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
ENGINE=INNODB;

-- Drop table events
DROP TABLE IF EXISTS `events`;

CREATE TABLE `events` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `VENUE_LOCATION` int(11),
  `EVENT_NAME` varchar(50),
  `EVENT_DATE` date,
  `EVENT_NAME_SK` varchar(50) CHARACTER SET utf8,
  `EVENT_DESC` varchar(255),
  `EVENT_DESC_SK` varchar(255) CHARACTER SET utf8,
  `IMAGE_URL` varchar(255),
  `EVENT_URL` varchar(255),
  `START_TIME` varchar(50),
  `END_TIME` varchar(50),
  `IF_ENTRANCE` int(1) DEFAULT '0',
  `ENTRANCE_PRICE` int(11) DEFAULT '0',
  PRIMARY KEY(`ID`),
  CONSTRAINT `Ref_03` FOREIGN KEY (`VENUE_LOCATION`)
    REFERENCES `venues`(`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
ENGINE=INNODB;

-- Drop table events_music_styles
DROP TABLE IF EXISTS `events_music_styles`;

CREATE TABLE `events_music_styles` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `EVENT_ID` int(11),
  `MUSIC_STYLE_ID` int(11),
  PRIMARY KEY(`ID`),
  CONSTRAINT `Ref_05` FOREIGN KEY (`MUSIC_STYLE_ID`)
    REFERENCES `music_styles`(`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Ref_06` FOREIGN KEY (`EVENT_ID`)
    REFERENCES `events`(`ID`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION
)
ENGINE=INNODB;

SET FOREIGN_KEY_CHECKS=1;

您可能希望将事件中的一对外键(
EVENT\u ID
MUSIC\u STYLE\u ID
)设置为唯一索引,否则您将能够多次将同一样式与同一事件关联

CREATE UNIQUE INDEX index_name
ON events_music_styles (EVENT_ID, MUSIC_STYLE_ID);
至于获取事件和相关音乐类型列表,我怀疑您必须在前端(javascript、PHP,以及您正在使用的任何其他内容)对数据进行一些处理。分组方式行不通,因为每个事件只能得到一种样式。这将需要对查询进行一些重写,并对查询获取逻辑进行更多的重写,以便根据需要格式化数据

$query = '
SELECT 
    e.ID, 
    e.EVENT_NAME, 
    e.EVENT_DATE, 
    e.ENTRANCE_PRICE, 
    v.BEER_PRICE, 
    v.WINE_PRICE, 
    v.SPIRITS_PRICE, 
    v.VENUE_NAME, 
    l.LOCATION, 
    ms.MUSIC_STYLE_NAME
FROM events AS e
INNER JOIN venues as v ON e.VENUE_LOCATION = v.ID
INNER JOIN locations AS l ON e.VENUE_LOCATION = l.ID
INNER JOIN events_music_styles AS ems ON e.ID = ems.EVENT_ID
INNER JOIN music_styles AS ms ON ms.ID = ems.MUSIC_STYLE_ID;';
if ($result = mysql_query ($query))
{
    $eventDetails = array ();
    // I think keys always end up lowercase when returned by MySQL so I'm using lower case key names here.  If it doesn't work then try with upper case.
    while ($row = mysql_fetch_assoc ($result))
    {
        // Add the event details to the results if they don't already exist in the array
        if (!array_key_exists ($row ['id'], $eventDetails))
        {
            $eventDetails [$row ['id']] = array (
                'ID' => $row ['id'],
                'EVENT_NAME' => $row ['event_name'],
                'EVENT_DATE' => $row ['event_date'],
                // Insert your other columns here
                'STYLES' => array ($row ['music_style_name'])
            );
        }
        // As we've already seen this event before we only need to add the musical style from this row to the result
        else
        {
          $eventDetails [$row ['id']]['STYLES'][] = $row ['music_style_name'];
        }
    }
}
else
{
    // Error handling logic here
}
这将生成一个如下所示的数组:

array (
    1 => array (
        'ID' => 1,
        'EVENT_NAME' => 'Some event name',
        'EVENT_DATE' => '11/11/2011',
        'STYLES' => array (
            0 => 'rock',
            1 => 'jazz'
        )
    ),
    2 => array (
        'ID' => 2,
        'EVENT_NAME' => 'Some other event name',
        'EVENT_DATE' => '22/11/2011',
        'STYLES' => array (
            0 => 'rock',
            1 => 'techno',
            2 => 'dance'
        )
    ),
    // ...
    n => array (
        'ID' => n,
        'EVENT_NAME' => 'Yet another event',
        'EVENT_DATE' => '12/12/2012',
        'STYLES' => array (
            0 => 'classical',
            1 => 'prog rock',
            2 => 'folk'
        )
    )
)
或者,如果您只想为样式创建一个逗号分隔的列表,您可以为样式创建一个字符串而不是数组,并且每次通过循环执行一个字符串,而不是将样式添加到数组中


注意:由于我无法访问您数据的完整数据库,也没有时间构建模型数据库,因此我没有测试上述代码。这应该行得通,但我不能做出任何承诺。希望,即使它不起作用,它仍然可以作为指导如何做你想做的事情

数据库中的多个关系通常表示设计有问题。很多很多关系都应该通过在关系的端点之间引入第三个元素来解决,使其成为一对多(或多对多)。在您的设计中,一个事件可以有许多样式,并且一个样式可以在许多事件中使用,这意味着在事件和样式之间需要存在一个额外的实体来解决多个关系。嗯,那么就我的数据库设计的当前状态而言,没有办法解决这个问题吗?有人告诉我,这是我应该做的,因为我是一个初学者,我没有质疑任何人的权威:)你应该尊重比你更有经验的人,但这并不意味着你永远不应该质疑他们!即使是有经验的人有时也是错的。对您的查询进行更仔细的检查表明,其中已经有一个事件样式关系解析表,用于解析事件和样式之间的许多关系,对吗?我可以建议您也将您的模式(数据库表的描述)发布到您的问题中吗?我现在就发布,戈登,谢谢!:)你好,戈登,我做了一个小的可视化图表,使它易于阅读:)-我还上传了我的sql表脚本:非常感谢:)非常感谢你的辛勤工作戈登!!!!我现在将研究这一点,并希望能够把一些东西放在一起!再次感谢你!!:)
$query = '
SELECT 
    e.ID, 
    e.EVENT_NAME, 
    e.EVENT_DATE, 
    e.ENTRANCE_PRICE, 
    v.BEER_PRICE, 
    v.WINE_PRICE, 
    v.SPIRITS_PRICE, 
    v.VENUE_NAME, 
    l.LOCATION, 
    ms.MUSIC_STYLE_NAME
FROM events AS e
INNER JOIN venues as v ON e.VENUE_LOCATION = v.ID
INNER JOIN locations AS l ON e.VENUE_LOCATION = l.ID
INNER JOIN events_music_styles AS ems ON e.ID = ems.EVENT_ID
INNER JOIN music_styles AS ms ON ms.ID = ems.MUSIC_STYLE_ID;';
if ($result = mysql_query ($query))
{
    $eventDetails = array ();
    // I think keys always end up lowercase when returned by MySQL so I'm using lower case key names here.  If it doesn't work then try with upper case.
    while ($row = mysql_fetch_assoc ($result))
    {
        // Add the event details to the results if they don't already exist in the array
        if (!array_key_exists ($row ['id'], $eventDetails))
        {
            $eventDetails [$row ['id']] = array (
                'ID' => $row ['id'],
                'EVENT_NAME' => $row ['event_name'],
                'EVENT_DATE' => $row ['event_date'],
                // Insert your other columns here
                'STYLES' => array ($row ['music_style_name'])
            );
        }
        // As we've already seen this event before we only need to add the musical style from this row to the result
        else
        {
          $eventDetails [$row ['id']]['STYLES'][] = $row ['music_style_name'];
        }
    }
}
else
{
    // Error handling logic here
}
array (
    1 => array (
        'ID' => 1,
        'EVENT_NAME' => 'Some event name',
        'EVENT_DATE' => '11/11/2011',
        'STYLES' => array (
            0 => 'rock',
            1 => 'jazz'
        )
    ),
    2 => array (
        'ID' => 2,
        'EVENT_NAME' => 'Some other event name',
        'EVENT_DATE' => '22/11/2011',
        'STYLES' => array (
            0 => 'rock',
            1 => 'techno',
            2 => 'dance'
        )
    ),
    // ...
    n => array (
        'ID' => n,
        'EVENT_NAME' => 'Yet another event',
        'EVENT_DATE' => '12/12/2012',
        'STYLES' => array (
            0 => 'classical',
            1 => 'prog rock',
            2 => 'folk'
        )
    )
)