Mysql เลือกวันที่น้อยกว่า xxxx-xx-xx แต่ว่าแสดงเฉพาะรายการวันที่ที่ใหม่ที่สุด?
มีข้อมูลอยู่ประมาณนี้...
Code (SQL)
CREATE TABLE IF NOT EXISTS `rdb_apm_bills` (
`bill_id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) DEFAULT NULL COMMENT 'refer to users.user_id of who add this',
`bill_customer_prefix` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_customer_firstname` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_customer_lastname` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_customer_nid` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`building_id` bigint(20) DEFAULT NULL ,
`bill_building_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`room_id` bigint(20) DEFAULT NULL ,
`bill_room_floor` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_room_num` varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_room_description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`rr_id` bigint(20) DEFAULT NULL ,
`bill_rr_price` decimal(20,9) NOT NULL ,
`bill_rr_description` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_rr_type` int(1) NOT NULL ,
`bill_cycle_type` int(1) NOT NULL DEFAULT 3 ,
`bill_date` date DEFAULT NULL ,
`bill_other_price` decimal(20,9) DEFAULT NULL ,
`bill_other_description` mediumtext COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_update_user_ids` mediumtext COLLATE utf8mb4_unicode_ci DEFAULT NULL ,
`bill_create_date` datetime DEFAULT NULL ,
`bill_last_update` datetime DEFAULT NULL,
`bill_skip_print` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY (`bill_id`),
KEY `user_id` (`user_id`),
KEY `building_id` (`building_id`),
KEY `room_id` (`room_id`),
KEY `rr_id` (`rr_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci AUTO_INCREMENT=7 ;
--
-- Dumping data for table `rdb_apm_bills`
--
INSERT INTO `rdb_apm_bills` (`bill_id`, `user_id`, `bill_customer_prefix`, `bill_customer_firstname`, `bill_customer_lastname`, `bill_customer_nid`, `building_id`, `bill_building_name`, `room_id`, `bill_room_floor`, `bill_room_num`, `bill_room_description`, `rr_id`, `bill_rr_price`, `bill_rr_description`, `bill_rr_type`, `bill_cycle_type`, `bill_date`, `bill_other_price`, `bill_other_description`, `bill_total`, `bill_update_user_ids`, `bill_create_date`, `bill_last_update`, `bill_skip_print`) VALUES
(1, 1, NULL, '101', 'dec19', NULL, 1, 'อาคาร 1', 9, '1', '101', NULL, 10, '10000.000000000', 'ร้านค้า <div>', 3, 3, '2019-12-01', NULL, NULL, '10090.000000000', 'a:1:{i:0;a:2:{s:7:"user_id";s:1:"1";s:8:"dateTime";i:1580211652;}}', '2020-01-28 18:23:51', '2020-01-28 18:40:52', 0),
(2, 1, NULL, '102', 'jan', NULL, 1, 'อาคาร 1', 10, '1', '102', NULL, 10, '10000.000000000', 'ร้านค้า <div>', 3, 3, '2020-01-01', NULL, NULL, '10114.000000000', NULL, '2020-01-28 18:24:23', '2020-01-28 18:24:23', 0),
(3, 1, NULL, '101', 'jan', NULL, 1, 'อาคาร 1', 9, '1', '101', NULL, 10, '10000.000000000', 'ร้านค้า <div>', 3, 3, '2020-01-01', NULL, NULL, '10102.000000000', 'a:1:{i:0;a:2:{s:7:"user_id";s:1:"1";s:8:"dateTime";i:1580211661;}}', '2020-01-28 18:24:34', '2020-01-28 18:41:01', 0),
(4, 1, NULL, '104', 'jan', NULL, 1, 'อาคาร 1', 12, '1', '104', NULL, 11, '11000.790000000', 'ร้านค้า', 3, 3, '2020-01-01', NULL, NULL, '11095.790000000', NULL, '2020-01-28 18:36:12', '2020-01-28 18:36:12', 0),
(5, 1, NULL, '104', 'feb', NULL, 1, 'อาคาร 1', 12, '1', '104', NULL, 11, '11000.790000000', 'ร้านค้า', 3, 3, '2020-02-01', NULL, NULL, '11181.790000000', 'a:2:{i:0;a:2:{s:7:"user_id";s:1:"1";s:8:"dateTime";i:1580211601;}i:1;a:2:{s:7:"user_id";s:1:"1";s:8:"dateTime";i:1580211425;}}', '2020-01-28 18:36:56', '2020-01-28 18:40:01', 0),
(6, 1, NULL, '102', 'mar', NULL, 1, 'อาคาร 1', 10, '1', '102', NULL, 10, '10000.000000000', 'ร้านค้า <div>', 3, 3, '2020-03-01', NULL, NULL, '10304.000000000', NULL, '2020-01-28 18:39:27', '2020-01-28 18:39:27', 0);
ต้องการเลือกแสดงหลายรายการโดยมีเงื่อนไขคือ
Code (SQL)
`rdb_apm_bills`.`room_id` IN ('9', '10', '11', '13', '14', '15', '16', '49', '50', '51', '52', '53', '54', '55', '56', '1', '2', '3', '4', '5', '6', '7', '8', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
และ
Code (SQL)
`bill_date` < '2020-02-01'
โดยที่เรียงลำดับเอาเฉพาะวันที่ `bill_date` ใหม่สุดออกมา.
ปัจจุบันใช้โค้ด
Code (SQL)
SELECT
`apm_bills`.*,
`apm_bill_meters`.*,
`apm_bills`.`bill_id` AS `bill_id`
FROM `rdb_apm_bills` AS `apm_bills`
LEFT JOIN `rdb_apm_bill_meters` AS `apm_bill_meters`
ON `apm_bills`.`bill_id` = `apm_bill_meters`.`bill_id`
WHERE 1
AND `apm_bills`.`room_id` IN ('9', '10', '11', '13', '14', '15', '16', '49', '50', '51', '52', '53', '54', '55', '56', '1', '2', '3', '4', '5', '6', '7', '8', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
AND `bill_date` < '2020-02-01'
GROUP BY `apm_bills`.`bill_id`
ORDER BY `apm_bills`.`bill_date` DESC;
แต่ว่า room_id 9 มันดันเอาข้อมูลวันที่ 2019-12-01 มาแทนซะนี่... (คือมันออกมาหลายอันซ้ำๆแล้วอันล่างสุดมัน 2019 แล้ว php ก็ดันแสดงผล 2019 ซะงั้น)
ทำไงให้มันได้ตามเงื่อนไขครับ?Tag : PHP, MySQL, MySQL
Date :
2020-01-28 19:41:57
By :
mr.v
View :
770
Reply :
9
Code (SQL)
select * from (
SELECT
`apm_bills`.*,
`apm_bill_meters`.*,
`apm_bills`.`bill_id` AS `bill_id`
FROM `rdb_apm_bills` AS `apm_bills`
LEFT JOIN `rdb_apm_bill_meters` AS `apm_bill_meters`
ON `apm_bills`.`bill_id` = `apm_bill_meters`.`bill_id`
WHERE 1
AND `apm_bills`.`room_id` IN ('9', '10', '11', '13', '14', '15', '16', '49', '50', '51', '52', '53', '54', '55', '56', '1', '2', '3', '4', '5', '6', '7', '8', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
AND `bill_date` < '2020-02-01'
GROUP BY `apm_bills`.`bill_id`
) as t
ORDER BY t.`bill_date` DESC;
ลองดูครับ ไม่รู้ว่าจะได้ไหม เพราะเคยเจอปัญหา order by หลัง group by ไม่ทำงาน ตามต้องการ
Date :
2020-01-28 20:24:20
By :
Chaidhanan
ขอตามครับ
Date :
2020-01-28 20:27:15
By :
Genesis™
Error ครับ
Quote: Duplicate column name 'bill_id'
ทดลองเอา join table ออกก็ปรากฏว่ายังไม่ได้ ผลลัพธ์เหมือนเดิมคือออกมาทั้ง 2 โดยมี 2019 อยู่ล่างสุด
Code (SQL)
SELECT * FROM (
SELECT
`apm_bills`.*
FROM `rdb_apm_bills` AS `apm_bills`
WHERE 1
AND `apm_bills`.`room_id` IN ('9', '10', '11', '13', '14', '15', '16', '49', '50', '51', '52', '53', '54', '55', '56', '1', '2', '3', '4', '5', '6', '7', '8', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
AND `bill_date` < '2020-02-01'
GROUP BY `apm_bills`.`bill_id`
) AS `t`
ORDER BY `t`.`bill_date` DESC;
edit: -------------
ได้เป็นอันนี้แทน
Code (SQL)
SELECT
`apm_bills`.*,
`apm_bill_meters`.*
FROM `rdb_apm_bills` AS `apm_bills`
INNER JOIN (
SELECT `bill_date` FROM `rdb_apm_bills` WHERE `bill_date` < '2020-02-01' ORDER BY `bill_date` DESC LIMIT 0, 1
) AS `tmp_bills` ON `apm_bills`.`bill_date` = `tmp_bills`.`bill_date`
LEFT JOIN `rdb_apm_bill_meters` AS `apm_bill_meters`
ON `apm_bills`.`bill_id` = `apm_bill_meters`.`bill_id`
WHERE 1
AND `apm_bills`.`room_id` IN ('9', '10', '11', '13', '14', '15', '16', '49', '50', '51', '52', '53', '54', '55', '56', '1', '2', '3', '4', '5', '6', '7', '8', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
#AND `apm_bills`.`bill_date` < '2020-02-01' # อันนี้จะมีหรือไม่ก็ได้ ค่าเท่ากัน
GROUP BY `apm_bills`.`room_id`
ORDER BY `bill_date` DESC
ข้อเสียคือมันหาเดือนล่าสุดไม่ได้ถ้า where เกินเดือนที่มีไป 1 เดือน
อย่างเช่นข้อมูลล่าสุดอยู่ที่ 2020-02-01 แต่ไป where `bill_date` < '2020-04-01' จะหาไม่เจออะไรเลย
ประวัติการแก้ไข 2020-01-28 20:56:25 2020-01-28 21:37:20 2020-01-28 21:38:00 2020-01-28 21:43:40
Date :
2020-01-28 20:54:20
By :
mr.v
อยากจะช่วย แต่ รัน SQL ไม่ได้ครับ ตารางไม่ครบ
Date :
2020-01-29 06:44:01
By :
{Cyberman}
ทำ ข้อ มูล มา ได้ งง มาก
กว่าจะ ทำ table,qry ได้
แบบนี้ได้ไหมครับ
Code (SQL)
SELECT top 1
apm_bills.bill_id,max(apm_bills.bill_date) --,
--apm_bill_meters.*,
--apm_bills.bill_id AS bill_idx
FROM rdb_apm_bills AS apm_bills
--LEFT JOIN rdb_apm_bill_meters AS apm_bill_meters
-- ON apm_bills.bill_id = apm_bill_meters.bill_id
WHERE 1 =1
AND apm_bills.room_id IN ('9', '10', '11', '13', '14', '15', '16', '49', '50', '51', '52', '53', '54', '55', '56', '1', '2', '3', '4', '5', '6', '7', '8', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44', '45', '46', '47', '48')
AND bill_date < '2020-03-01'
GROUP BY apm_bills.bill_id
ORDER BY max(apm_bills.bill_date) DESC;
Date :
2020-01-29 15:58:44
By :
WWWWIN
Load balance : Server 04