MySQL counting results from max() - mysql

I have a MySQL table that tracks inventory scans in and out of the location. Example data like this:
bar_code_id,scan_type,scan_timestamp
038755,in,"2020-03-19 16:58:18"
038755,out,"2020-03-10 12:51:47"
001548,in,"2020-03-06 14:50:41"
012170,in,"2020-03-06 14:50:28"
020166,in,"2020-03-06 14:49:48"
022908,in,"2020-03-06 14:49:07"
012169,out,"2020-03-02 11:48:43"
020182,out,"2020-03-02 11:48:24"
047270,in,"2020-01-29 16:54:18"
020166,out,"2020-01-20 11:43:44"
012170,out,"2020-01-20 11:43:32"
022908,out,"2020-01-20 11:43:23"
001548,out,"2020-01-20 11:43:16"
016852,in,"2020-01-20 09:42:07"
020182,in,"2020-01-20 09:42:02"
012172,out,"2020-01-14 12:56:00"
012172,in,"2020-01-14 11:06:22"
001548,in,"2020-01-14 10:46:47"
010606,in,"2020-01-14 10:46:46"
012169,in,"2020-01-14 10:46:45"
020166,in,"2020-01-14 10:46:45"
010054,in,"2020-01-13 14:59:50"
012167,in,"2020-01-13 14:58:33"
020175,out,"2020-01-09 12:16:16"
023260,in,"2020-01-07 12:01:12"
038755,in,"2020-01-06 09:15:23"
I'm trying to create a query that will show the current number inside the building. I am able to find the latest scan of each asset using the following:
select bar_code_id, max(scan_timestamp)
from scans
group by bar_code_id
order by bar_code_id
Giving the following results:
bar_code_id,timestamp
001548,"2020-03-06 14:50:41"
010054,"2020-01-13 14:59:50"
010606,"2020-01-14 10:46:46"
012167,"2020-01-13 14:58:33"
012169,"2020-03-02 11:48:43"
012170,"2020-03-06 14:50:28"
012172,"2020-01-14 12:56:00"
016852,"2020-01-20 09:42:07"
020166,"2020-03-06 14:49:48"
020175,"2020-01-09 12:16:16"
020182,"2020-03-02 11:48:24"
022908,"2020-03-06 14:49:07"
023260,"2020-01-07 12:01:12"
038755,"2020-03-19 16:58:18"
047270,"2020-01-29 16:54:18"
But can't work out how to show what the scan type is too. Ideally I would like to be able to count the number of items where the last scan was 'in' and also the total number of items.
Any pointers?
edit
I'm trying to only look at the most recent scan for each bar_code and then count the number where the scan_type is 'in'
So the latest scan for each bar_code is:
bar_code_id,scan_type,scan_timestamp
001548,in,2020-03-06 14:50:41
010054,in,2020-01-13 14:59:50
010606,in,2020-01-14 10:46:46
012167,in,2020-01-13 14:58:33
012169,out,2020-03-02 11:48:43
012170,in,2020-03-06 14:50:28
012172,out,2020-01-14 12:56:00
016852,in,2020-01-20 09:42:07
020166,in,2020-03-06 14:49:48
020175,out,2020-01-09 12:16:16
020182,out,2020-03-02 11:48:24
022908,in,2020-03-06 14:49:07
023260,in,2020-01-07 12:01:12
038755,in,2020-03-19 16:58:18
047270,in,2020-01-29 16:54:18
And then the ones that were type 'in' are:
bar_code_id,scan_type,scan_timestamp
001548,in,2020-03-06 14:50:41
010054,in,2020-01-13 14:59:50
010606,in,2020-01-14 10:46:46
012167,in,2020-01-13 14:58:33
012170,in,2020-03-06 14:50:28
016852,in,2020-01-20 09:42:07
020166,in,2020-03-06 14:49:48
022908,in,2020-03-06 14:49:07
023260,in,2020-01-07 12:01:12
038755,in,2020-03-19 16:58:18
047270,in,2020-01-29 16:54:18
Giving an answer of 11.
My sql query using max(scan_timestamp) does not include the scan_type so this cannot be counted. If i try to include this then the max function shows more than just the latest scan
select bar_code_id, max(scan_timestamp) as timestamp, scan_type
from scans
group by bar_code_id, scan_type
bar_code_id,timestamp,scan_type
038755,"2020-03-19 16:58:18",in
020166,"2020-01-20 11:43:44",out
012170,"2020-01-20 11:43:32",out
022908,"2020-01-20 11:43:23",out
001548,"2020-01-20 11:43:16",out
016852,"2020-01-20 09:42:07",in
020182,"2020-01-20 09:42:02",in
012172,"2020-01-14 12:56:00",out
012172,"2020-01-14 11:06:22",in
001548,"2020-03-06 14:50:41",in
010606,"2020-01-14 10:46:46",in
038755,"2020-03-10 12:51:47",out
012169,"2020-01-14 10:46:45",in
020166,"2020-03-06 14:49:48",in
010054,"2020-01-13 14:59:50",in
012167,"2020-01-13 14:58:33",in
020175,"2020-01-09 12:16:16",out
023260,"2020-01-07 12:01:12",in
012170,"2020-03-06 14:50:28",in
022908,"2020-03-06 14:49:07",in
012169,"2020-03-02 11:48:43",out
020182,"2020-03-02 11:48:24",out
047270,"2020-01-29 16:54:18",in

I don't know if this is really what you want, but I have this request:
SELECT bar_code_id, MAX(scan_timestamp) as timetamps, scan_type, COUNT(scan_type) as number_of_items, (SELECT COUNT(id) from scans) as total
FROM scans
WHERE scan_type = 'in'
GROUP BY bar_code_id
ORDER BY bar_code_id
Here is the link where I tested this request: http://sqlfiddle.com/#!9/0da168/19
I'm available if you have a question about my answer.

Related

How to get rid of "the expression you entered exceeds the1,024-character limit for the query design

How to get rid of "the expression you entered exceeds the 1,024-character limit for the query design? As I would need to extract the huge data based on the query in the access below.
Please see my query below. Any help is appreciated.
SELECT dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Year, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Month, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Day, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PERIOD, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONFIGURATIONNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONNECTIONMEMBERNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.VALUE, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PRICINGRUNGROUPCODE, DateValue([dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING]![STARTDATE]) AS STARTDATE
FROM dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING, Input_BP
WHERE (((dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PRICINGRUNGROUPCODE)="BP1B") AND ((DateValue([dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING]![STARTDATE])) Between #4/1/2021# And #4/30/2021#))
GROUP BY dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Year, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Month, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Day, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PERIOD, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONFIGURATIONNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONNECTIONMEMBERNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.VALUE, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PRICINGRUNGROUPCODE, DateValue([dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING]![STARTDATE])
HAVING (((dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300140218" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300140226" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300140952" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300310001" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300313005" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300352052" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300469013" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300473072" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300482024" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300582096" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300582120" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300602001" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300629020" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300654028" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300670016" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300761021" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300774099" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300786051" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300786069" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300786085" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300843142" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300894517" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300897973" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300897981" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300964005" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300992725" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300992733" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300992741" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301001294" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301001302" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301001310" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301001328" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301003407" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301003464" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301003472" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301010147" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301010154" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301030434" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301030558" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035045" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035052" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035060" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035144" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035151" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035169" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035276" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035284" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035300" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035318" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035326" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301035334" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301036027" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301040052" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301047008" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301049269" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301049293" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301049301" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301049319" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301049343" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301064003" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301128006" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301176898" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301218849" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9301344538"));
Thanks
Using an alias for the table name and replacing OR col = val1 OR col = val1 OR col2 = val ... with col in (val1, val2, val3, ...) will save you a lot of characters. It will also make the code a lot easier to understand. I also removed the reference to Input_BP, which did not seem to be contributing anything except the possibility of a ton of duplicate results.
SELECT T.Year,
T.Month,
T.Day,
T.PERIOD,
T.CONFIGURATIONNAME,
T.CONNECTIONMEMBERNAME,
T.VALUE,
T.MSSLID,
T.PRICINGRUNGROUPCODE,
DateValue([T]![STARTDATE]) AS STARTDATE
FROM dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING As T
WHERE (((T.PRICINGRUNGROUPCODE)="BP1B")
AND ((DateValue([T]![STARTDATE])) Between #4/1/2021# And #4/30/2021#))
GROUP BY T.Year,
T.Month,
T.Day,
T.PERIOD,
T.CONFIGURATIONNAME,
T.CONNECTIONMEMBERNAME,
T.VALUE,
T.MSSLID,
T.PRICINGRUNGROUPCODE,
DateValue([T]![STARTDATE])
HAVING (T.MSSLID IN ("9300140218", ...));
If you want to be able to access the query design builder, I recommend copying and pasting maybe half of the repeated fields towards the bottom to a note/word file so you can delete some of the fields in SQL? And I'm not sure if this is for a report or a form, but try to use VBA to reduce the query; or maybe use the function Right() for the field MSSLID so you don't have to write the first "9300"?
(This is just a reduced version of your code; I'm not sure if you're making a report or form or if you just wanted to make a query)
SELECT dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Year, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Month, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Day, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PERIOD, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONFIGURATIONNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONNECTIONMEMBERNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.VALUE, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PRICINGRUNGROUPCODE, DateValue([dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING]![STARTDATE]) AS STARTDATE FROM dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING, Input_BP WHERE (((dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PRICINGRUNGROUPCODE)="BP1B") AND ((DateValue([dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING]![STARTDATE])) Between #4/1/2021# And #4/30/2021#)) GROUP BY dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Year, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Month, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.Day, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PERIOD, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONFIGURATIONNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.CONNECTIONMEMBERNAME, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.VALUE, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID, dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.PRICINGRUNGROUPCODE, DateValue([dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING]![STARTDATE]) HAVING (((dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300140218" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300140226" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300140952" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300310001" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300313005" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300352052" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300469013" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300473072" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300482024" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300582096" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300582120" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300602001" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300629020" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300654028" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300670016" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300761021" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300774099" Or (dbo_plp_MCSEMVALCONSUMPTIONVALIDATIONVIEW_BILLING.MSSLID)="9300786051"));
Let me know if this helps!

MySQL Restraint Not Being Passed Down Through Views

I am working with a system that has multiple views chained upon each other. For some reason, there is a problematic view which isn't passing the restraint down through the chain (despite them having a key in common). For example, here is the visual explain statement. Visual Explain of SQL View
As you can see, the main view is based upon two other views (which, in turn, are based off another set of views). The problem view in this example is ResourcePointsAndCategories (on the right-hand side bottom). In this query, I am restraining results by a WHERE clause based on a column called HostID. HostID is in my supporting view; however, the key is not being passed down, and therefore, the view is loading 23,000 rows, instead of the 3 I want.
Any help to explain or correct this issue would be greatly appreciated. Thanks!
Edit: Sorry, should have included the code from the start:
Here is for the main view:
VIEW `test`.`resourcepointswithlookupsandcategorycountandportalpagescount` AS
SELECT
`resourcepointswithlookups`.`URL` AS `URL`,
`resourcepointswithlookups`.`Format` AS `Format`,
`resourcepointswithlookups`.`Host` AS `Host`,
`resourcepointswithlookups`.`ResourceID` AS `ResourceID`,
`resourcepointswithlookups`.`HostID` AS `HostID`,
`resourcepointswithlookups`.`PermitID` AS `PermitID`,
`resourcepointswithlookups`.`ResourceTitle` AS `ResourceTitle`,
`resourcepointswithlookups`.`FormatID` AS `FormatID`,
`resourcepointswithlookups`.`TypeID` AS `TypeID`,
`resourcepointswithlookups`.`Notes` AS `Notes`,
`resourcepointswithlookups`.`Description` AS `Description`,
`resourcepointswithlookups`.`ReferenceFirstName` AS `ReferenceFirstName`,
`resourcepointswithlookups`.`ReferenceLastName` AS `ReferenceLastName`,
`resourcepointswithlookups`.`ReferenceEmail` AS `ReferenceEmail`,
`resourcepointswithlookups`.`ReferencePermission` AS `ReferencePermission`,
`resourcepointswithlookups`.`ReferenceComment` AS `ReferenceComment`,
`resourcepointswithlookups`.`CreateDate` AS `CreateDate`,
`resourcepointswithlookups`.`CreateBy` AS `CreateBy`,
`resourcepointswithlookups`.`LastEditDate` AS `LastEditDate`,
`resourcepointswithlookups`.`LastEditBy` AS `LastEditBy`,
`resourcepointswithlookups`.`LastReview` AS `LastReview`,
`resourcepointswithlookups`.`LastReviewBy` AS `LastReviewBy`,
`resourcepointswithlookups`.`Type` AS `Type`,
`resourcepointswithlookups`.`LibraryURL` AS `LibraryURL`,
`resourcepointswithlookups`.`TypeCollection` AS `TypeCollection`,
`resourcepointsandcategoriescount`.`CategoryCount` AS `CategoryCount`,
`portalpagecountwithresourcepointsandportaltitle`.`PortalPageCount` AS `PortalPageCount`,
`resourcepointswithlookups`.`NormFileStatus` AS `NormFileStatus`,
`resourcepointswithlookups`.`NormFileStatusDate` AS `NormFileStatusDate`,
`resourcepointswithlookups`.`FileSystemStatus` AS `FileSystemStatus`,
`resourcepointswithlookups`.`FileSystemStatusDate` AS `FileSystemStatusDate`,
`resourcepointswithlookups`.`LanguageName` AS `LanguageName`,
`resourcepointswithlookups`.`LanguageCode` AS `LanguageCode`
FROM
((`test`.`resourcepointswithlookups`
LEFT JOIN `test`.`portalpagecountwithresourcepointsandportaltitle` ON ((`resourcepointswithlookups`.`ResourceID` = `portalpagecountwithresourcepointsandportaltitle`.`ResourcePointID`)))
LEFT JOIN `test`.`resourcepointsandcategoriescount` ON ((`resourcepointswithlookups`.`ResourceID` = `resourcepointsandcategoriescount`.`ResourceID`)))
And here's the code for the problem view:
VIEW `test`.`resourcepointsandcategoriescount` AS
SELECT
`resourcepointsandcategories`.`ResourceID` AS `ResourceID`,
`resourcepointsandcategories`.`HostID` AS `HostID`,
COUNT(`resourcepointsandcategories`.`CategoryID`) AS `CategoryCount`
FROM
`test`.`resourcepointsandcategories`
GROUP BY `resourcepointsandcategories`.`ResourceID`
And, ultimately, the view the problem view is based off of (which runs fine):
VIEW `test`.`resourcepointsandcategories` AS
SELECT
`test`.`resourcepoints`.`ResourceID` AS `ResourceID`,
`test`.`resourcepoints`.`HostID` AS `HostID`,
`test`.`lkupegcategories`.`Category` AS `Category`,
`test`.`resourcepointcategories`.`CategoryID` AS `CategoryID`
FROM
((`test`.`resourcepointcategories`
JOIN `test`.`resourcepoints` ON ((`test`.`resourcepointcategories`.`ResourceID` = `test`.`resourcepoints`.`ResourceID`)))
LEFT JOIN `test`.`lkupegcategories` ON ((`test`.`lkupegcategories`.`eGCategoryID` = `test`.`resourcepointcategories`.`CategoryID`)))
The query I am calling is:
SELECT * FROM test.resourcepointswithlookupsandcategorycountandportalpagescount WHERE HostID = 4532;
If I read your views correctly, you are filtering the first (big) view on HostID = 4532, but not filtering the other two views on it.
Perhaps the ON clauses need to include AND res....HostID = res...HostID.

MySQL 'multiple rows' from two joins challenge

I have the following MySQL query joining two additional tables..
SELECT plants.plant_id,
plants.scientific_name,
plants_features.features,
plants_features.features_id
FROM plants_features,
plants2features,
plants
WHERE plants_features.features_id = plants2features.features_id
AND plants2features.plant_id = plants.plant_id
and I was happy with the output.
plant_id,scientific_name,features,features_id
3,"Actaea matsumurae 'White Pearl' (Bugbane)","colourful fruit",6
11,"Heuchera 'Beauty Colour' (Coral bells)","salt resistant/coastal",15
18,"Phyllostachys nigra (Black bamboo)","colourful bark",5
26,"Carex morrowii 'Silver Sceptre' (Japanese sedge)","drought tolerant",18
27,"Heuchera 'Obsidian' (Coral bells)","salt resistant/coastal",15
29,"Dianella tasmanica 'Tas Red' (Flax lily)","drought tolerant",18
38,"Stipa tenuissima (Mexican feather grass)","attractive seed-heads",2
38,"Stipa tenuissima (Mexican feather grass)","invasive/self seed/suckering",13
You can see from the plant_id '38' (bottom two rows) that it's outputting more than one row per record.
My question is guys, can you please advise what exactly the new MySQL query needs to be to ensure multiple rows are in one record by 'plant_id'?
Thanks in advance,
Richard.
You need grouping and aggregation functions. You can use GROUP_CONCAT to get comma separated list:
SELECT plants.plant_id,
plants.scientific_name,
GROUP_CONCAT(plants_features.features) AS features,
GROUP_CONCAT(plants_features.features_id) AS feature_ids
FROM plants_features
JOIN plants2features
ON plants_features.features_id = plants2features.features_id
JOIN plants
ON plants2features.plant_id = plants.plant_id
GROUP BY plants.plant_id, plants.scientific_name;
Also use JOIN syntax instead of comma and where.

Doctrine2 query behavior with groupBy

I have the following custom method in the repo:
$query = $qb->select('Client', 'Organization')
->from(':Client', 'Client')
->leftJoin('Client.organizations', 'Organization');
--different searh conditions--
Then I use paginator to get the results:
$paginator = new \Doctrine\ORM\Tools\Pagination\Paginator($query->getQuery());
$clients = $paginator->getQuery()
->setMaxResults($length)
->setFirstResult($start);
Here where the magic comes.
I set length to 10 and first result to 0. So basicaly I should get 10 results on the page. However if there are 5 Organizations for the Client (Client mtm Organization), there will be 5 results, if there are 7 Organizations - 3 results.
But if I add
$query->groupBy('Client');
Then all is "ok" with the root level of results: i.e. there are 10 Clients on the page, but there is not all of the Organizations (max 1).
Did anyone experience the same issue? Any thoughts, suggestions?
It probably counts the same item several times.
Try once to add a distinct clause to your query.
$query = $qb->select('Client', 'Organization')
->from(':Client', 'Client')
->leftJoin('Client.organizations', 'Organization');
->distinct();

Webmatrix if statement issues. any ideas?

I have written a SQL query, which extracts the lowest weekly price for a property stored in my database:
var rPropertyId = Request.QueryString["PropertyID"];
var cheapestrate = "SELECT TOP 1 * FROM RateInfo WHERE PropertyID=#0 ORDER BY RateWeekly ASC";
var qcheapestrate = db.QuerySingle (cheapestrate, rPropertyId);
I'm pretty confident that this statement is correct. The problem i have, is that not ALL propertys have pricing, so i only want to show this price if they do. I have created the below if statement, but it's telling me i'm missing an ; somewhere?
#if(qcheapestrate=!null){
Rates From qcheapestrate.rateweekly per week
}
So i'm trying to check if the query returns an entry. if it does, i want to show the lowest "rateweekly" value. Hopefully this all makes sense!
Try this...
#if(qcheapestrate!=null){
<text>Rates From</text>
#qcheapestrate.rateweekly
<text>per week</text>
}