了解MySql查询

时间:2014-02-05 13:25:04

标签: mysql

尝试自学一点mysql和php,并决定通过实际项目帮助做到这一点哦“如何用MySQL和PHP书做任何事情”。

我遇到的第一个问题是理解联合表查询。

这是我的表格:

    CREATE TABLE `clients` (
    `id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
    `client` VARCHAR(50) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `KlientID` (`id`)
    )
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=8;

CREATE TABLE `facilities` (
`id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
    `facility` VARCHAR(45) NOT NULL,
    `fk_client` SMALLINT(6) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `fk_idklijent_idx` (`fk_client`),
    CONSTRAINT `FK_client_id` FOREIGN KEY (`fk_client`) REFERENCES `clients` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=35;

CREATE TABLE `models` (
    `id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
    `model` VARCHAR(50) NOT NULL,
    `fk_manufacturer` SMALLINT(6) NOT NULL,
    PRIMARY KEY (`id`),
    INDEX `ModelID` (`id`),
    INDEX `fk_proizvodjacID_idx` (`fk_manufacturer`),
    CONSTRAINT `FK_manuf_id` FOREIGN KEY (`fk_manufacturer`) REFERENCES `manufacturers` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=9;

CREATE TABLE `machines` (
    `id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
    `serial` VARCHAR(50) NOT NULL,
    `fk_model` SMALLINT(6) NOT NULL,
    `InvBr` INT(11) NULL DEFAULT '0',
    `fk_facilities` SMALLINT(6) NULL DEFAULT '0',
    `sw` VARCHAR(255) NULL DEFAULT NULL,
    `adaptation` VARCHAR(255) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `FK_uredjaji_modeli` (`fk_model`),
    INDEX `FK_uredjaji_poslovnice` (`fk_facilities`),
    INDEX `Index 4` (`serial`),
    CONSTRAINT `FK_facility_id` FOREIGN KEY (`fk_facilities`) REFERENCES `facilities` (`id`) ON UPDATE CASCADE ON DELETE CASCADE,
    CONSTRAINT `FK_models_id` FOREIGN KEY (`fk_model`) REFERENCES `models` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=93;

CREATE TABLE `technicians` (
    `id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(50) NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    INDEX `ServiserID` (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=5;

CREATE TABLE `workorders` (
    `id` SMALLINT(6) NOT NULL AUTO_INCREMENT,
    `wo_nr` VARCHAR(50) NOT NULL,
    `fk_machine_id` SMALLINT(6) NOT NULL,
    `fk_technitian_id` SMALLINT(6) NOT NULL,
    `counter` INT(11) NOT NULL DEFAULT '0',
    `service_date` DATE NOT NULL,
    `description` LONGTEXT NOT NULL,
    `work_hours` INT(11) NOT NULL DEFAULT '1',
    PRIMARY KEY (`id`),
    INDEX `FK_rn_serviseri` (`fk_technitian_id`),
    INDEX `FK_machines_id_idx` (`fk_machine_id`),
    CONSTRAINT `FK_machines_id` FOREIGN KEY (`fk_machine_id`) REFERENCES `machines` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION,
    CONSTRAINT `FK_technitian_id` FOREIGN KEY (`fk_technitian_id`) REFERENCES `technicians` (`id`) ON UPDATE NO ACTION ON DELETE NO ACTION
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1393;

使用此查询我得到每一行8次。

SELECT DATE_FORMAT (w.service_date, '%d.%m.%Y'), f.facility, m.model, mc.serial, w.description, t.name
FROM workorders AS w, facilities AS f, models AS m, machines AS mc, technicians AS t
WHERE f.id = mc.fk_facilities AND w.fk_machine_id = mc.id AND w.fk_technitian_id = t.id AND w.service_date > '2009-12-31'
ORDER BY w.service_date DESC;
有人可以指出我做错了什么。 我只需要来自workorders表的行。其他表格只是为了显示真实数据而不仅仅是id - 坏,不是真的:(

THX

编辑1: 我需要一份工作人员名单。解释我的问题这里的结果应该是多少: [日期] [机器(fk_machine_id)所属设施的名称] [机器型号(fk_machine_id)] [机器的序列号(fk_machine_id)] [工作订单说明] [技术员名称(fk_technician_id)]

EDIT2:

here is the model image

我认为我的问题实际上是为了获得模型我需要首先检查机器表。与设施相同的事情。

5 个答案:

答案 0 :(得分:1)

得到了它!

问题在于缺少一个AND。

最终SELECT看起来像这样:

SELECT DATE_FORMAT (w.service_date, '%d.%m.%Y') AS service_date, w.wo_nr, f.facility, m.model, mc.serial, FORMAT (w.counter, 0) AS Counter, w.description, t.name AS technician 
FROM workorders AS w, technicians AS t, machines AS mc, models AS m, facilities AS f
WHERE mc.fk_facilities = f.id 
AND w.fk_machine_id = mc.id 
AND mc.fk_model = m.id 
AND w.fk_technitian_id = t.id 
AND w.service_date > '2009-12-31'
ORDER BY w.service_date DESC;
总而言之。继续讨论下一个问题:)

答案 1 :(得分:0)

仅从工作单表中获取行使用此查询

SELECT w.*
FROM workorders AS w, facilities AS f, models AS m, machines AS mc, technicians AS t
WHERE f.id = mc.fk_facilities AND w.fk_machine_id = mc.id AND w.fk_technitian_id = t.id AND w.service_date > '2009-12-31'
ORDER BY w.service_date DESC;

答案 2 :(得分:0)

您说您只需要来自工作单位表的数据。然后你不需要所有其他连接。

SELECT * FROM workorders WHERE service_date > '2009-12-31'

除非你需要表中的列。

不太确定你需要什么。

答案 3 :(得分:0)

只将您想要在结果集中返回的列放在查询的SELECT部分​​中。您仍然可以在联接中包含其他表中的列,它们将不会显示。此外,如果您获得多行,那么您的数据包含重复项,在这种情况下,您应该查看您的键和约束,或者您缺少一个或多个连接。

答案 4 :(得分:0)

这对你有用吗?

SELECT DISTINCT DATE_FORMAT (w.service_date, '%d.%m.%Y') as service_date,  
f.facility, m.model, mc.serial, w.description, t.name
FROM workorders AS w, facilities AS f, models AS m, machines AS mc, technicians AS t
WHERE f.id = mc.fk_facilities 
AND w.fk_machine_id = mc.id 
AND w.fk_technitian_id = t.id 
AND w.service_date > '2009-12-31'
ORDER BY w.service_date DESC;