What is wrong with this query?
SELECT DISTINCT source,
source_description,
url
FROM staging_census
WHERE Trim(Concat(source, source_description, url)) NOT IN (SELECT
Trim(Concat(source,
source_description, url))
FROM dim_source);
The objective is to pull only the records where a combination of Source, Source_Description and URL that does not exist (which is true in my case). However, if it sees a match in only one column it ignores it.
MySQL Newbie... if there is a better way for this query I would appreciate it.
Try this:
SELECT DISTINCT Source, Source_Description, URL
FROM Staging_Census
WHERE CONCAT(TRIM(Source), TRIM(Source_Description0, TRIM(URL))) NOT IN (SELECT CONCAT(TRIM(Source), TRIM(Source_Description0, TRIM(URL))) FROM DIM_Source);
OR
SELECT DISTINCT SC.Source, SC.Source_Description, SC.URL
FROM Staging_Censusc SC
LEFT JOIN DIM_Source DS ON (TRIM(SC.Source), TRIM(AC.Source_Description0, TRIM(SC.URL)) = (TRIM(DS.Source), TRIM(DS.Source_Description0, TRIM(DS.URL))
WHERE DS.DimsourceId IS NULL
Related
I have an input parameter to a query I'm trying to write. Basically, if mostRecentSnapshot == true then I want to select only the most recent records from the process run (basically where max(creationDate)) and if mostRecentSnapshot == false then select creationDate and other columns normally.
To me, it makes sense to do this if statement in the from clause, but I don't think that's possible. Normally I would use a CTE, but I those don't exist in MySQL.
What is the best way to achieve this?
It would be something along the lines of this:
SELECT
CASE mostRecentSnapshot WHEN FALSE THEN
(
processauditheader.creationDate as processCreationDate,
processauditheader.processName,
processauditheader.processType,
processauditheader.processHost,
processauditheader.processDatabase,
processauditheader.tableAudited,
processauditheader.processInvokedByName,
processauditheader.processInvokedByType,
processauditheader.processInvokedByDatabase,
processauditheader.processIntervalValue,
processauditheader.processIntervalField,
processauditheader.auditScenarios,
processaudititerationdetail.creationDate as iterationDate,
processaudititerationdetail.connectionId,
processaudititerationdetail.processDate,
processaudititerationdetail.tableRowCount,
processaudititerationdetail.tableRowCountLastDay,
processaudititerationdetail.previousProcessAuditIterationDetailID,
processauditmetricdetail.creationDate,
processauditmetricdetail.processAuditIterationDetailID,
processauditmetricdetail.auditMetric,
processauditmetricdetail.auditTotal,
processauditmetricdetail.auditExample
)
WHEN TRUE THEN
(
((SELECT MAX(processaudititerationdetail.creationDate) as maxSnapshot,
processaudititerationdetail.id
from reporting_audit.processaudititerationdetail
group by processaudititerationdetail.creationDate) mostRecent
JOIN reporting_audit.processaudititerationdetail ON mostRecent.id = processaudititerationdetail.id)
)
END
FROM reporting_audit.processauditheader
JOIN processaudititerationdetail ON processaudititerationdetail.processAuditHeaderID = processauditheader.id
LEFT JOIN processauditmetricdetail ON processauditmetricdetail.processAuditIterationDetailID = processaudititerationdetail.id
A query can only return a fixed set of columns. Perhaps the following does what you want:
select paid.*
from reporting_audit.processaudititerationdetail paid
where (not v_mostRecentSnapshot) or
paid.creation_date = (select max(paid2.creationDate from reporting_audit.processaudititerationdetail paid2);
It will either select all records from the table or only the record(s) that have the most recent creationDate.
I am trying to do an INNER JOIN on two tables that have similar values, but not quite the same. One table has a fully qualified host name for its primary key, and the other the hosts short name, as well as the subdomain. It it safe to assume that the short name and the subdomain together are unique.
So I've tried:
SELECT table1.nisinfo.* FROM table1.nisinfo INNER JOIN table2.hosts ON (table1.nisinfo.shortname + '.' + table1.nisinfo.subdomainname + '.domain.com') = table2.hosts.fqhn WHERE table2.hosts.package = 'somepkg';
This doesn't return the results I expect, it returns the first result hundreds of times. I'd like to return distinct rows. It takes a long time to run as well.
What am I doing wrong? I was thinking of running a subquery to get the hostnames, but I don't know what the right path from here is.
Thank you!
You can use group by in your query so you can achieve the desired results you want
please see this two links
Group by with 2 distinct columns in SQL Server
http://www.sqlteam.com/article/how-to-use-group-by-with-distinct-aggregates-and-derived-tables
Try putting your results into a temp table and then view the table to make sure that the columns are as expected.
SELECT table1.nisinfo.*, table1.nisinfo.shortname + '.' + table1.nisinfo.subdomainname + '.domain.com' AS ColID
INTO #temp
FROM table1.nisinfo;
Select *
from #temp INNER JOIN table2.hosts ON ##temp.ColID = table2.hosts.fqhn
WHERE table2.hosts.package = 'somepkg'
;
Put a Group By clause at the end of the second statement
So in this case, I used a subquery to get the initial results, and then used a join.
SELECT table1.nisinfo.* FROM table1.nisinfo JOIN (SELECT distinct(fqhn) FROM table2.hosts WHERE package = 'bash') AS FQ ON ((SUBSTRING_INDEX(FQ.fqhn, '.', 1)) = table1.nisinfo.shortname);
I have two select:
SELECT ID, ID_cat, modello
FROM tbArticoli
WHERE ID_cat=5
Example result in Json:
{"ID":"5","ID_cat":"5","modello":"Hawaii"},
{"ID":"6","ID_cat":"5","modello":"T-Shirt Righe"},
{"ID":"7","ID_cat":"5","modello":"Polo"},
{"ID":"8","ID_cat":"5","modello":"Fantasia"},
{"ID":"9","ID_cat":"5","modello":"Fiori"},
{"ID":"10","ID_cat":"5","modello":"Arcobaleno"},
{"ID":"11","ID_cat":"5","modello":"Oro"},
{"ID":"12","ID_cat":"5","modello":"Argento"},
{"ID":"13","ID_cat":"5","modello":"StelleStrisce"}
And another select:
SELECT IDModello,
FLOOR(AVG(voto)) AS votomedio
FROM tbCommenti
GROUP BY IDModello
with result:
{"IDModello":"5","votomedio":"7"},
{"IDModello":"6","votomedio":"7"},
{"IDModello":"7","votomedio":"8"},
{"IDModello":"8","votomedio":"6"}
I need a final result like this:
{"ID":"5","ID_cat":"5","modello":"Hawaii","votomedio":"7"},
{"ID":"6","ID_cat":"5","modello":"T-Shirt Righe","votomedio":"7"},
{"ID":"7","ID_cat":"5","modello":"Polo","votomedio":"8"},
{"ID":"8","ID_cat":"5","modello":"Fantasia","votomedio":"6"},
{"ID":"9","ID_cat":"5","modello":"Fiori","votomedio":"null"},
{"ID":"10","ID_cat":"5","modello":"Arcobaleno","votomedio":"null"},
{"ID":"11","ID_cat":"5","modello":"Oro","votomedio":"null"},
{"ID":"12","ID_cat":"5","modello":"Argento","votomedio":"null"},
{"ID":"13","ID_cat":"5","modello":"StelleStrisce","votomedio":"null"}
on tbArticoli.ID = tbCommenti.IDModello
Which is the best query?
Thank you.
Assuming you want to join on id = idmodello, you can do something like
SELECT *
FROM (SELECT ID, ID_cat, modello
FROM tbArticoli
WHERE ID_cat=5) AS tbA
LEFT JOIN (SELECT IDModello,
FLOOR(AVG(voto)) AS votomedio
FROM tbCommenti
GROUP BY IDModello) as tbC
ON tbA.ID = tbC.IDModello
You can specify subqueries as what you are selecting from, because MySQL selects from a set of tuples. The table name just specifies that you want all tuples from that table, whereas in the query above you are specifying the specific tuples that you want. The main thing to note in this query is that you must use the 'AS' keyword to specify a temp name for each set of tuples.
I want to find only failed user details, but the below query is giving duplicate records. I am not able to find a proper solution.
To find failed job details I'm using the below query:
select * from executionlog e
join catalog c on e.reportid = c.itemid
where c.name like '%reportname%'
and timestart>= '2013-04-15 09:00:00.000'
and status <> 'rsSuccess'
However, the above query is giving duplicate values for a particular report.
How can I get unique details?
Note: we cannot apply distinct or group by because the table contains columns of ntext and image data types
If you want only "failed user details" then don't select the ntext or image columns at all. That way you can do a DISTINCT normally:
SELECT DISTINCT
--Parameters,
--Content,
--Property,
--Parameter,
InstanceName, ReportID, UserName, RequestType, Format, TimeStart, TimeEnd,
TimeDataRetrieval, TimeProcessing, TimeRendering, Source, Status, ByteCount,
[RowCount], ItemID, Path, Name, ParentID, Type, Intermediate, SnapshotDataID,
LinkSourceID, Description, Hidden, CreatedByID, CreationDate, ModifiedByID,
ModifiedDate, MimeType, SnapshotLimit, PolicyID, PolicyRoot, ExecutionFlag,
ExecutionTime
FROM executionlog e
JOIN catalog c ON e.reportid = c.itemid
WHERE c.name LIKE '%reportname%'
AND timestart>= '2013-04-15 09:00:00.000'
AND status <> 'rsSuccess'
You can even trim many more columns. Note that doing SELECT * is a bad practice for many cases anyway.
If you're interested in the corresponding ntext and/or image values you can always join the catalog against the above subquery again.
MySQL Server Version: Server version: 4.1.14
MySQL client version: 3.23.49
Tables under discussion: ads_list and ads_cate.
Table Relationship: ads_cate has many ads_list.
Keyed by: ads_cate.id = ads_list.Category.
I am not sure what is going on here, but I am trying to use COUNT() in a simple agreggate query, and I get blank output.
Here is a simple example, this returns expected results:
$queryCats = "SELECT id, cateName FROM ads_cate ORDER BY cateName";
But if I modify it to add the COUNT() and the other query data I get no array return w/ print_r() (no results)?
$queryCats = "SELECT ads_cate.cateName, ads_list.COUNT(ads_cate.id),
FROM ads_cate INNER JOIN ads_list
ON ads_cate.id = ads_list.category
GROUP BY cateName ORDER BY cateName";
Ultimately, I am trying to get a count of ad_list items in each category.
Is there a MySQL version conflict on what I am trying to do here?
NOTE: I spent some time breaking this down, item by item and the COUNT() seems to cause the array() to disappear. And the the JOIN seemed to do the same thing... It does not help I am developing this on a Yahoo server with no access to the php or mysql error settings.
I think your COUNT syntax is wrong. It should be:
COUNT(ads_cate.id)
or
COUNT(ads_list.id)
depending on what you are counting.
Count is an aggregate. means ever return result set at least one
here you be try count ads_list.id not null but that wrong. how say Myke Count(ads_cate.id) or Count(ads_list.id) is better approach
you have inner join ads_cate.id = ads_list.category so Count(ads_cate.id) or COUNT(ads_list.id) is not necessary just count(*)
now if you dont want null add having
only match
SELECT ads_cate.cateName, COUNT(*),
FROM ads_cate INNER JOIN ads_list
ON ads_cate.id = ads_list.category
GROUP BY cateName
having not count(*) is null
ORDER BY cateName
all
SELECT ads_cate.cateName, IFNULL(COUNT(*),0),
FROM ads_cate LEFT JOIN ads_list
ON ads_cate.id = ads_list.category
GROUP BY cateName
ORDER BY cateName
Did you try:
$queryCats = "SELECT ads_cate.cateName, COUNT(ads_cate.id)
FROM ads_cate
JOIN ads_list ON ads_cate.id = ads_list.category
GROUP BY ads_cate.cateName";
I am guessing that you need the category to be in the list, in that case the query here should work. Try it without the ORDER BY first.
You were probably getting errors. Check your server logs.
Also, see what happens when you try this:
SELECT COUNT(*), category
FROM ads_list
GROUP BY category
Your array is empty or disappear because your query has errors:
there should be no comma before the FROM
the "ads_list." prefix before COUNT is incorrect
Please try running that query directly in MySQL and you'll see the errors. Or try echoing the output using mysql_error().
Now, some other points related to your query:
there is no need to do ORDER BY because GROUP BY by default sorts on the grouped column
you are doing a count on the wrong column that will always give you 1
Perhaps you are trying to retrieve the count of ads_list per ads_cate? This might be your query then:
SELECT `ads_cate`.`cateName`, COUNT(`ads_list`.`category`) `cnt_ads_list`
FROM `ads_cate`
INNER JOIN `ads_list` ON `ads_cate`.`id` = `ads_list`.`category`
GROUP BY `cateName`;
Hope it helps?