Hallo,

Ik heb een MySQL query die 13 sec duurt nu is mijn vraag kan ik 1e gewoon mijn html pagina en dat die query op de achtergrond wordt uitgevoerd en als hij dan klaar laat ie zien wat ie terug heeft gehad.
Peter de Beer op 19/11/2013 13:05:38

<?php

SELECT
count(uid) as uid
FROM
`table`
WHERE
hostname NOT IN (SELECT
url
FROM
Hosters)
GROUP BY hostname
HAVING uid > 20

?>

AUW een NOT IN met een subquery op een dergelijk aantal records, dat is inderdaad vragen om moeilijkheden. Probeer het eens anders zou ik zeggen:

SELECT COUNT(uid) as uid
FROM (
  SELECT hostname, uid
  FROM `table` a
  LEFT JOIN hosters b ON a.hostname = b.url
  WHERE b.url IS NULL
) c
GROUP BY hostname
HAVING uid > 20;

Nu kan het zijn dat de query niet helemaal werkt, aangezien ik bijvoorbeeld niet kan zien waar uid vandaan komt (uit welke tabel). Maar als het wel werkt gok ik dat het aanzienlijk sneller zal zijn....
Waarom die (zinloze) subquery?
En dan de GROUP BY op hostname terwijl die niet in de select list staat, in MySQL kan dat, maar in ANSI SQL niet. Lijkt me trouwens ook wel handig om erbij te hebben.
Erwin H op 19/11/2013 14:45:28

[quote="Peter de Beer op 19/11/2013 13:05:38"]
<?php

SELECT
count(uid) as uid
FROM
`table`
WHERE
hostname NOT IN (SELECT
url
FROM
Hosters)
GROUP BY hostname
HAVING uid > 20

?>

AUW een NOT IN met een subquery op een dergelijk aantal records, dat is inderdaad vragen om moeilijkheden. Probeer het eens anders zou ik zeggen:

SELECT COUNT(uid) as uid
FROM (
  SELECT hostname, uid
  FROM `table` a
  LEFT JOIN hosters b ON a.hostname = b.url
  WHERE b.url IS NULL
) c
GROUP BY hostname
HAVING uid > 20;

Nu kan het zijn dat de query niet helemaal werkt, aangezien ik bijvoorbeeld niet kan zien waar uid vandaan komt (uit welke tabel). Maar als het wel werkt gok ik dat het aanzienlijk sneller zal zijn....

[/quote]


SELECT 
    COUNT(uid) as uid, hostname
FROM
    (SELECT 
        hostname, uid
    FROM
        `table_a`
    LEFT JOIN table_b ON `table_a`.`hostname` = table_b.url
    WHERE
        table_b.url IS NULL)
GROUP BY hostname


Ik heb aan gepast op mijn situatie maar ik krijg steeds een error
Peter de Beer op 20/11/2013 09:03:32

Ik heb aan gepast op mijn situatie maar ik krijg steeds een error


En welke error dat is mogen wij niet weten?
Er bestaat geen alias voor de subquery achter de FROM en dat moet wel.
Maar nogmaals die is helemaal niet nodig:

SELECT 
    COUNT(uid) as uid, hostname
FROM
        table_a
LEFT JOIN table_b ON table_a.hostname = table_b.url
WHERE
      table_b.url IS NULL
GROUP BY hostname

Let wel op dat je indexen zet op de kolommen waarop je joined
- SanThe - op 20/11/2013 09:06:55

[quote="Peter de Beer op 20/11/2013 09:03:32"]
Ik heb aan gepast op mijn situatie maar ik krijg steeds een error


En welke error dat is mogen wij niet weten?
[/quote]

Natuurlijk

Error Code: 1248. Every derived table must have its own alias 0,001 sec




Toevoeging op 20/11/2013 09:37:32:

Ger van Steenderen op 20/11/2013 09:19:25

Er bestaat geen alias voor de subquery achter de FROM en dat moet wel.
Maar nogmaals die is helemaal niet nodig:

SELECT 
    COUNT(uid) as uid, hostname
FROM
        table_a
LEFT JOIN table_b ON table_a.hostname = table_b.url
WHERE
      table_b.url IS NULL
GROUP BY hostname

Let wel op dat je indexen zet op de kolommen waarop je joined



Idexen heb ik er op zitten

Error Code: 1052. Column 'uid' in field list is ambiguous 0,001 sec



Is dit uit table_a of table_b?
COUNT(uid)
Ambiguous krijg je omdat je in beide tabellen kolommen met dezelfde naam hebt, en in de select niet aangeeft uit welke tabel je hem moet hebben. Gebruik standaard FQN's (Fully Qualified Names - table_a.uid -) in queries met joines, zit je altijd goed.

SELECT 
    COUNT(table_a.uid) as uid
FROM
    table_a
        LEFT JOIN
    table_b ON table_a.`hostname` = table_b.url
WHERE
    table_b.url IS NULL
GROUP BY hostname
HAVING uid > 20;



197 row(s) returned 10,870 sec / 0,000 sec

Het is mij volledig onduidelijk wat je met deze query wilt bereiken, je krijgt nu alleen een rijtje met getallen binnen. En nogmaals mij MySQL is hier een uitzondering op, in de meeste DBMS kan je niet op anonymous kolommen groeperen.

Het blijft hoe dan ook een draak van een querie.

Reageren